4

在下面的代码中:

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

printTest 将显示“函数”而不是“未定义”,这是有道理的,因为根据我的理解,任何变量声明总是被“提升”到执行上下文的顶部(在这种情况下是函数执行上下文)这使得函数声明“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 现在显示“数字”,这意味着执行上下文现在保持不同的顺序。有人可以解释这里实际发生了什么吗?

4

2 回答 2

2

var test仅表示“任何称为测试的内容都应在本地范围内”。它是未定义的,只是因为你没有给它赋值(除了你有function test(){};这就是你得到function而不是的原因undefined)。

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

于 2011-06-11T22:20:45.763 回答
2

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

(function (){
        var test, printTest;
        test = function (){};
        test = 1;//assign value to a variable here
        printTest = typeof test;
        document.write(printTest);
    })();
于 2011-06-11T22:21:01.627 回答