let关键字问题

时间:2016-11-10 09:20:45

标签: javascript

我正在玩一些代码并遇到一种情况,我无法确定为什么'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'的全局副本?

4 个答案:

答案 0 :(得分:5)

例外是关于右侧 x - 当您初始化块范围 x 变量时,全局变量已经是&#34 ;遗忘"但是新的仍未被声明,并且在初始化期间无法使用

与显式调用全局

进行比较
    function f() {
      let x = window.x || 30;
    }

另请参阅this MDN article关于死区

答案 1 :(得分:0)

允许您将范围有限的变量声明为使用它的块,语句或表达式。这与 var 关键字不同, var 关键字全局定义变量,或者无论块范围如何,都在本地定义整个函数。

在您的情况下,抛出异常是因为您使用相同的名称定义let。

For More Info

答案 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