为什么,使用此代码,第一个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"
你不能同时拥有同名的变量)
答案 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