2016-11-10 45 views
5

我在玩一些代码,遇到了一种情况,我无法确定为什么'let'的行为是这样。let关键字问题

对于以下代码块:

var x = 20; // global scope 
 

 
function f() { 
 
    let x = x || 30; 
 
} 
 

 
f(); // VM3426:1 Uncaught ReferenceError: x is not defined(…)

我得到的错误上执行F 'x被没有定义'()。我明白“让”变量不会被提升,但是因为'x'有全局副本,为什么函数'f'中的行不是全局副本而是抛出错误? 在函数的开头,'let'是否设置变量未声明(而不是由于提升引起的'未定义'var)? 有没有办法在函数中获取'x'的全局副本?

+0

的[“让”的关键字与“VAR”可能的复制关键字在Javascript](http://stackoverflow.com/questions/762011/let-keyword-vs-var-keyword-in-javascript) – ozil

+1

本地'x'的声明是阴影的全球之一,但你是根据现有的'x'分配一个值,compliler ca没有找到一个像一个是被遮蔽的,另外一个还没有被宣布。 –

回答

5

唯一的例外是关于右侧X - 当你初始化块范围X可变全球一个已经“遗忘”,然而新一仍然没有被宣布,并在无法使用初始化

有明确呼吁全球一个

function f() { 
     let x = window.x || 30; 
    } 

而且看看this MDN article比较约死区

+1

所以你所说的是这部分'let x'首先被计算,局部变量'x'被创建但没有被声明(这样全局x被映射),然后这个部分被执行。没有找到30'和'x'? –

+0

是的 - 这就是发生了什么 –

+0

谢谢,我想知道这个过程'创建,但没有声明'被称为 –

0

允许您将范围受限的变量声明为使用它的块,语句或表达式。这与var关键字不同,该关键字在全局范围内定义变量,或者在本地定义整个功能,而不考虑块范围。

在你的情况下,抛出一个异常是因为你定义了let的同名。

For More Info

+0

这应该不是问题,在函数内部它应该使用'let' x,在'var'之外 –

0

局部x的声明阴影全局的和新的还没有宣布第一和初始化过程中不能使用。这是同样的情况类似以下内容:

var foo = 5; 
    function do_something() { 
     console.log(foo); // ReferenceError 
     let foo = 2; 
    } 
    do_something(); 

仅供参考MDN

至于建议由@ m.antkowicz你可以在你的情况下使用window.x