为什么我没有定义"我没有定义"而不是' i'已经宣布

时间:2018-02-26 08:50:57

标签: javascript ecmascript-6

为什么,使用此代码,第一个console.log()会生成错误(出乎意料,因为我认为此行为var,而不是let) :

(function() {
    "use strict";
    let i=12;
    function test() {  
        console.log(i);   
        let i=4544444;     
        console.log(i);     
    };
    test();
})();

我能得到:

Uncaught ReferenceError: i is not defined

?此外,如果我评论这些行:

(function() {
    "use strict";
    let i=12;
    function test() {  
        console.log(i);   
        //let i=4544444;     
        //console.log(i);     
    };
    test();
})();

然后它有效(我想"use strict"你不能同时拥有同名的变量)

2 个答案:

答案 0 :(得分:1)

  

让变量在块的顶部注册。但当时   在声明之前访问变量,JavaScript会引发错误:   ReferenceError:未定义。从声明   声明直到块的开头,变量在a中   时间死区,无法访问。

function isTruthy(value) {  
  var myVariable = 'Value 1';
  if (value) {
    /**
     * temporal dead zone for myVariable
     */
    // Throws ReferenceError: myVariable is not defined
    console.log(myVariable);
    let myVariable = 'Value 2';
    // end of temporary dead zone for myVariable
    console.log(myVariable); // => 'Value 2'
    return true;
  }
  return false;
}
isTruthy(1); // => true 

来源:https://dmitripavlutin.com/javascript-hoisting-in-details/

答案 1 :(得分:0)

let keyword对使用它的块,语句或表达式的范围有限。 在你的情况下,首先让i = 12具有整个块的范围但是第二个让i = 4544444具有测试功能块的范围所以在此块之前声明我,你在console.log中使用i,所以这生成Uncaught ReferenceError:i未定义,当您评论let i = 4544444时,则使用值为12的i

reference to let keyword scope