ES6默认参数中内联函数的变量作用域问题咨询
ES6默认参数中内联函数的作用域机制解析
你这个问题问到点子上了——ES6默认参数的作用域规则确实容易让人困惑,尤其是当参数里有内联函数的时候。咱们一步步拆解:
核心结论:参数列表有独立的词法作用域
没错,你猜的完全正确!在你提到的“函数一”里,参数列表里的内联函数f确实拥有自己的闭包,它引用的x是参数作用域里的x,和函数体内部用var x = 5;定义的x根本不是同一个变量。
为什么会这样?ES6规定,函数的参数列表会形成一个单独的词法作用域,这个作用域位于全局作用域和函数体内部作用域之间。也就是说:
- 参数
x和内联函数f都在这个参数作用域里被定义 - 函数体内部的代码属于另一个作用域,当你在函数体里用
var x = 5时,因为var的变量提升特性,这个x会在函数体作用域里被声明,和参数作用域的x是两个完全独立的变量 - 内联函数
f是在参数作用域里创建的,它的闭包会捕获参数作用域里的x,所以不管函数体里怎么重新定义x,f()返回的始终是参数传入的x值
函数一的等价写法
如果要把这种作用域隔离的效果显式写出来,大概是这样的(用块级作用域模拟参数作用域的独立性):
function func1(x) { // 模拟参数作用域:这里的x是传入的参数,f绑定这个x const f = () => x; // 函数体作用域,和参数作用域隔离 { var x = 5; // 这个x只在当前块(函数体)里生效 return f(); } }
比如你调用func1(10),会返回10而不是5,正好验证了这个作用域隔离的特性。
补充:无内部重定义的情况
如果函数体里没有重新定义x,那函数体里的x就会指向参数作用域里的x,这时候内联函数f和函数体里的代码共享同一个x变量。
内容的提问来源于stack exchange,提问作者Andrei Dvoynos
相关产品推荐
相关产品推荐

