Ben*_*Ben 6 javascript parameters scope language-lawyer
a无论是否存在同名变量,以下代码始终打印传入 parameter 的参数。
大概是因为参数标识符分别绑定到作用域中的变量。他们在哪里?他们在词汇环境中吗?
function foo(a, b = () => a) {
var a = 1
console.log(b())
}
foo() // undefined
foo(2) // 2Run Code Online (Sandbox Code Playgroud)
是不是var声明最终在特殊的VariableEnvironment 中,而参数位于 LexicalEnvironment 中?而let和const避免作出重新定义一个早期的错误冲突?
相关的还有:
如果存在任何默认值,则会为参数创建单独的环境记录。
在此位置声明的函数的语义使得该环境记录定义了它们的本地范围。规范中的注释(参见第 28 条)指出:
注意:需要单独的环境记录来确保由形参列表中的表达式创建的闭包不具有函数体中声明的可见性。
更多来自规范:
当建立执行上下文来评估 ECMAScript 函数时,会创建一个新函数环境记录,并在该环境记录中实例化每个形式参数的绑定。函数体中的每个声明也被实例化。如果函数的形式参数不包含任何默认值初始值设定项,则函数体声明将在与参数相同的环境记录中实例化。如果存在默认值参数初始值设定项,则会为主体声明创建第二个环境记录。形式参数和函数作为 FunctionDeclarationInstantiation 的一部分进行初始化。所有其他绑定均在函数体求值期间初始化。
因此,在没有默认参数的情况下,我推断预先存在的词法环境之一(VariableEnvironment 或 LexicalEnvironment)用于参数绑定。或许。