Javascript - 提升问题

时间:2011-06-11 22:15:06

标签: javascript hoisting

在下面的代码中:

(function (){
    function test(){};//"function"
    var test;//"undefined"
    var printTest = typeof test;
    document.write(printTest);
})();

printTest将显示“function”而不是“undefined”,这是有道理的,因为从我的理解,任何变量声明总是“提升”到执行上下文的顶部(在这种情况下是函数执行上下文)这使得函数声明“test()”是稍后在当前执行上下文中出现的函数。现在考虑这个代码,我实际上为var声明“var test = 1”赋值。

(function (){
        function test(){};
        var test=1;//assign value to a variable here
        var printTest = typeof test;
        document.write(printTest);
    })();

然后printTest现在显示“数字”,这意味着执行上下文现在保持不同的顺序。有人能解释一下这里发生了什么吗?

2 个答案:

答案 0 :(得分:2)

var test仅表示“任何被称为测试的东西应该是本地范围的”。它是未定义的,只是因为您没有为其指定值(除了function test(){};之外,这就是为什么您得到function而不是undefined)。

在第二个示例中,function test(){};仍然为其分配了一个函数,但随后var test=1;1覆盖了该函数。您在之后使用typeof 1分配{{1}},因此它会报告它是一个数字。

答案 1 :(得分:2)

Hoisting将实际赋值与变量声明分开。它真正做的是:

(function (){
        var test, printTest;
        test = function (){};
        test = 1;//assign value to a variable here
        printTest = typeof test;
        document.write(printTest);
    })();