为什么javascript在一个函数中从父作用域访问值而在另一个函数中没有?

为什么第二个代码段出现意外行为?

此问题与Questions on Javascript hoisting不同,因为此问题包括IIFE,本地范围,并且是尝试更好地理解父范围.

此功能正确输出

var one = 1;
function sayOne() {
    console.log(one); // actually gets the value from the global scope
}
sayOne();

输出:

1

但是这个没有.

var one = 1;
function sayDoom() {
    console.log(one); // somehow does not get the value from parent scope
    var one = 2;
    console.log(one);
    (function() {
        var one = 3;
        console.log(one); // displays correctly
    })();
}
sayDoom();

输出:

undefined
2
3

预期:

1
2
3

最佳答案
好吧,JavaScript声明已经悬挂.因此,变量可以在使用后声明.换一种说法;变量可以在声明之前使用.因此,Javascript会像这样读取你的函数:

var one = 1;
function sayDoom() {
    var one;
    console.log(one); // one is not defined in the current scope
    one = 2;
    console.log(one);
    (function() {
        var one = 3;
        console.log(one);
    })();
}
sayDoom();

转载注明原文:为什么javascript在一个函数中从父作用域访问值而在另一个函数中没有? - 代码日志