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);
})();