JavaScript作用域上if(true)的奇怪行为...?

问题描述 投票:0回答:2

我在测试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 从全局范围中本地声明。

谁能解释一下为什么会这样?

javascript scope const var let
2个回答
2
投票

在第一种情况下, var 声明的范围是在函数级别,因此它仅限于 function test

第二例如果范围是块范围,因此 var 声明由于 Hoisting

因此在第一种情况下,你不能使用 m 外部函数测试,但在第二种情况下可以这样做。


3
投票

这是因为 吊装. 还 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>
© www.soinside.com 2019 - 2024. All rights reserved.