【问题标题】:Function Expression itself cannot assign Name to another Value函数表达式本身不能将名称分配给另一个值
【发布时间】:2011-09-13 05:07:46
【问题描述】:

在下面的代码中:

(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 现在显示“数字”,这意味着执行上下文现在保持不同的顺序。有人能解释一下这里到底发生了什么吗?

【问题讨论】:

  • 函数声明不以分号结尾,因此您在function test 行末尾的; 被评估为在该位置无用的空语句。因此,删除该分号。

标签: javascript hoisting


【解决方案1】:

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

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

【讨论】:

  • 也许var test, test, printTest; 会让这一点更明显。
【解决方案2】:

var test 仅表示“任何称为 test 的内容都应在本地范围内”。它是未定义的,只是因为您没有为其分配值(除非您有function test(){};,这就是为什么您得到function 而不是undefined)。

在第二个示例中,function test(){}; 仍为其分配一个函数,但随后var test=1;1 覆盖它。你使用typeof 你分配1给它,所以它报告它是一个数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多