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