CPH*_*hon 10 javascript scope global let ecmascript-6
我正在阅读文档示例之间的区别,var并let测试当调用未声明的变量时,全局作用域自动为其提供声明(这就是为什么以下代码段不会在任何变量中引发错误):
x = 3;
console.log(x);
(function() {
y=x+39;
})()
console.log(y);Run Code Online (Sandbox Code Playgroud)
但是,当let在同一全局范围内赋值后声明一个变量时:
x=3;
let x = 42;
console.log(x);Run Code Online (Sandbox Code Playgroud)
抛出以下错误之一:
ReferenceError:
x未定义(Chromium)ReferenceError:
x在初始化之前无法访问词法声明(Firefox)
我明白这let不允许x提升,但由于它先前被引用(暗示来自全局范围的自动声明),在这种情况下不应该重新声明吗?
SyntaxError:
x已声明标识符
因此抛出上面的错误?
我也明白,在严格模式下,第一个片段会抛出一个ReferenceError,所以这是否意味着let在全局范围内强制执行严格模式的特定规则(所有变量都需要声明)?
你是对的,这是奇怪的行为。它给出这些错误的原因是因为它认为您正在尝试将值分配3给let变量而不是全局值。正如其他人提到的,这会导致提升时出现暂时的死区问题。
\n\n\n\n\n这些变量是在实例化其包含的词法环境时创建的,但在评估变量 xe2x80x99sn LexicalBinding 之前不能以任何方式访问
\n
此代码显示了放置代码导致 TDZ 的位置:
\n\n// Accessing `x` here before control flow evaluates the `let x` statement\n// would throw a ReferenceError due to TDZ.\n// console.log(x);\n\nlet x = 42;\n// From here on, accessing `x` is perfectly fine!\nconsole.log(x);\nRun Code Online (Sandbox Code Playgroud)\n\n您可以看到将其包装let在自己的块内可以修复它:
x=3;\n{\nlet x = 42;\nconsole.log(x); // 42\n}\nRun Code Online (Sandbox Code Playgroud)\n\n或者,您可以在对象上显式定义全局window:
window.x=3;\n\nlet x = 42;\nconsole.log(x); // 42\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |