ES2015词法arguments解析:square函数为何嵌套箭头函数?
关于ES2015词法arguments与箭头函数嵌套的疑问解答
嘿,这个问题问到点子上了——ES2015箭头函数的词法作用域特性在这里是核心!咱们一步步拆解来看:
原代码的运行逻辑
先理清楚原代码的执行流程:
- 当你调用
square(2, 4, 7.5, 8, 11.5, 21)时,square函数内部的arguments对象会包含所有传入的参数。 - 接着定义的箭头函数
example有个关键特性:箭头函数没有属于自己的arguments对象,它会直接沿用外层作用域(也就是square函数)的arguments。 - 调用
example()时,里面的for...of循环遍历的其实是square的arguments,把每个数值平方后存入数组,最终返回这个结果数组。
为什么要嵌套箭头函数?
你改写的版本完全可以正常工作,而且更简洁——普通函数square本身就拥有自己的arguments对象,直接遍历处理就能实现需求。那原代码多套一层箭头函数的目的,其实是为了演示箭头函数的词法arguments特性:它不会像普通函数那样创建自己的arguments,而是继承外层函数的这个变量。
嵌套箭头函数带来的行为改变
把逻辑放到嵌套的箭头函数里,和直接写在square函数里相比,主要有这些差异:
arguments的来源不同:如果把example改成普通函数,调用example()时没有传参数,它自己的arguments会是空的,代码就会失效;但箭头函数用的是外层square的arguments,所以能正常处理传入square的参数。this的绑定规则改变:箭头函数没有自己的this,它的this会继承自外层作用域的this(这个例子里没用到this,但这是箭头函数的核心特性之一)。- 无法作为构造函数使用:箭头函数不能被
new关键字调用,不过这个例子里没涉及到构造函数场景,但这也是嵌套后函数特性的变化。
内容的提问来源于stack exchange,提问作者epeleg
相关产品推荐
相关产品推荐

