Javascript 函数表达式本身无法将名称指定给其他值

Javascript 函数表达式本身无法将名称指定给其他值,javascript,hoisting,Javascript,Hoisting,在下面的代码中: (function (){ function test(){};//"function" var test;//"undefined" var printTest = typeof test; document.write(printTest); })(); printTest将显示“function”而不是“undefined”,这是有意义的,因为据我所知,任何变量声明总是“提升”到执行上下文的顶部(在本例中是函数执行上下文),这使得函数声明

在下面的代码中:

(function (){
    function test(){};//"function"
    var test;//"undefined"
    var printTest = typeof test;
    document.write(printTest);
})();
printTest将显示“function”而不是“undefined”,这是有意义的,因为据我所知,任何变量声明总是“提升”到执行上下文的顶部(在本例中是函数执行上下文),这使得函数声明为“test()是稍后在当前执行上下文中显示的。现在考虑这个代码,我实际上将一个值赋值给var声明“var test=1”。
然后printTest现在显示“number”,这意味着执行上下文现在保持不同的顺序。有人能解释一下这里到底发生了什么吗?

var-test
只意味着“任何被称为test的东西都应该在本地范围内”。它是未定义的,只是因为您没有给它赋值(除了您使用
function test(){};
,这就是为什么您得到
函数
,而不是
未定义


在第二个示例中,
function test(){}仍然为其分配函数,但随后
var test=1
1
覆盖该值。将
1
赋值后,使用
typeof
,这样它会报告它是一个数字。

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

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

函数声明不会以分号结尾,因此您的
功能测试
行末尾的code>被评估为空语句,在该位置无效。因此,删除该分号。可能
var测试、测试、打印测试将使这一点更加明显。
(function (){
        var test, printTest;
        test = function (){};
        test = 1;//assign value to a variable here
        printTest = typeof test;
        document.write(printTest);
    })();