以下代码始终打印传递给参数的参数a
,无论是否存在同名变量。
大概是因为参数标识符单独绑定到范围内的变量。他们的位置在哪里?它们处于词汇环境中吗?
function foo(a, b = () => a) {
var a = 1
console.log(b())
}
foo() // undefined
foo(2) // 2
是那个吗var
声明最终以特殊形式结束可变环境,而参数位于 LexicalEnvironment 中?和let
and const
通过使重新定义成为早期错误来避免冲突?
相关还有:
- 8.3.2 解析绑定(name [, env])
- 8.1.1 环境记录
如果存在任何默认值,为参数创建单独的环境记录。
在此位置声明的函数的语义使得该环境记录定义了它们的本地范围。 A规范中的注释(见第28条)说:
注意:需要单独的环境记录来确保由形参列表中的表达式创建的闭包不具有函数体中声明的可见性。
更多来自the spec:
当建立执行上下文来评估 ECMAScript 函数时,会创建一个新函数环境记录,并在该环境记录中实例化每个形式参数的绑定。函数体中的每个声明也被实例化。如果函数的形式参数不包含任何默认值初始值设定项,则函数体声明将在与参数相同的环境记录中实例化。如果存在默认值参数初始值设定项,则会为主体声明创建第二个环境记录。形式参数和函数作为 FunctionDeclarationInstantiation 的一部分进行初始化。所有其他绑定均在函数体求值期间初始化。
因此,在没有默认参数的情况下,我推断预先存在的词法环境之一(VariableEnvironment 或 LexicalEnvironment)用于参数绑定。或许。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)