我正在玩一些代码并遇到一种情况,我无法确定为什么'let'的行为方式。
对于以下代码块:
var x = 20; // global scope
function f() {
let x = x || 30;
}
f(); // VM3426:1 Uncaught ReferenceError: x is not defined(…)
执行f()时出现错误'x未定义'。我确实理解'let'变量没有被提升但是因为'x'有一个全局副本,为什么函数'f'中的行不是默认为全局副本而不是抛出错误? 'let'是否在函数开头将变量设置为未声明(而不是因为提升而使用var的'undefined')? 有没有办法在函数中获得'x'的全局副本?
答案 0 :(得分:5)
例外是关于右侧 x - 当您初始化块范围 x 变量时,全局变量已经是&#34 ;遗忘"但是新的仍未被声明,并且在初始化期间无法使用
与显式调用全局
进行比较 function f() {
let x = window.x || 30;
}
另请参阅this MDN article关于让死区
答案 1 :(得分:0)
让允许您将范围有限的变量声明为使用它的块,语句或表达式。这与 var 关键字不同, var 关键字全局定义变量,或者无论块范围如何,都在本地定义整个函数。
在您的情况下,抛出异常是因为您使用相同的名称定义let。
答案 2 :(得分:0)
本地x的声明是遮蔽全局的声明,而新的声明仍未首先声明,并且在初始化期间不能使用。这是同样的情况如下:
var foo = 5;
function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
}
do_something();
供参考MDN
根据@ m.antkowicz的建议,您可以在案件中使用window.x
。
答案 3 :(得分:0)
您可以使用此关键字访问全局范围
var x= 20; // global scope
function f() {
let x =this.x || 30;
}
f();
但在严格模式下,这将默认为undefined
阅读https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this