为什么此闭包函数中number未定义却没有触发编译报错?
问题解答
你提到的number是multiplier函数返回的箭头函数的形参,既不是未定义的全局变量,也不是独立函数,代码没有报错是符合JavaScript语法规则的,具体解释如下:
- 这是ES6箭头函数的简写特性:当箭头函数只有1个入参时,可以省略包裹参数的圆括号。你看到的
number => number * factor等价于完整写法:
这里的function(number) { return number * factor }number是显式声明的形参,所以不会抛出未定义的错误。 - 代码执行逻辑可以拆分为两步:
- 执行
multiplier(2)时,入参factor被赋值为2,函数返回上述接收number参数的箭头函数,赋值给变量twice,此时twice本身就是一个可调用的函数。 - 执行
twice(5)时,就是调用这个箭头函数,传入的5就是number对应的实参,最终计算5 * 2得到返回值10。
- 执行
如果想让代码可读性更强,你可以手动给箭头函数的参数加上圆括号,就不会出现类似的误解了:
function multiplier(factor) { return (number) => number * factor; }
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

