if(true) 在 JavaScript 范围内的奇怪行为......?
Weird behavior of if(true) on JavaScript scope..?
所以我在测试 JavsScript 的范围(var、let 和 const),我发现了一个我无法真正理解的奇怪行为。
var write = document.getElementById('demo');
function test() {
var m = 'hello';
}
test();
write.innerHTML = m;
//This doesn't work
在上述情况下,JS 无法访问从全局范围本地声明的 var m。
var write = document.getElementById('demo');
if(true) {
var m = 'hello';
}
write.innerHTML = m;
//This works
在上述情况下,JS 访问从全局范围本地声明的 var m。
有人可以解释为什么会这样吗?
在第一种情况下,var
声明的范围在函数级别,因此仅限于 function test
在第二种情况中,如果作用域是块作用域并且因此var
声明由于Hoisting
而逃逸到全局作用域
因此在第一种情况下你不能使用m
外部函数测试但你可以在第二种情况下使用。
是因为Hoisting。此外 var
具有功能级别范围
var write = document.getElementById('demo');
var m; // m will be undefined here, declared but not initialized
if (true) {
m = 'hello'; // m is initialized her
}
write.innerHTML = m;
<div id='demo'></div>
所以我在测试 JavsScript 的范围(var、let 和 const),我发现了一个我无法真正理解的奇怪行为。
var write = document.getElementById('demo');
function test() {
var m = 'hello';
}
test();
write.innerHTML = m;
//This doesn't work
在上述情况下,JS 无法访问从全局范围本地声明的 var m。
var write = document.getElementById('demo');
if(true) {
var m = 'hello';
}
write.innerHTML = m;
//This works
在上述情况下,JS 访问从全局范围本地声明的 var m。
有人可以解释为什么会这样吗?
在第一种情况下,var
声明的范围在函数级别,因此仅限于 function test
在第二种情况中,如果作用域是块作用域并且因此var
声明由于Hoisting
因此在第一种情况下你不能使用m
外部函数测试但你可以在第二种情况下使用。
是因为Hoisting。此外 var
具有功能级别范围
var write = document.getElementById('demo');
var m; // m will be undefined here, declared but not initialized
if (true) {
m = 'hello'; // m is initialized her
}
write.innerHTML = m;
<div id='demo'></div>