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>