JS把定义在后面的变量(并不赋值)或函数(整个函数)提升到前面定义。
作用域(scoping)
变量提升(Hoisting)
最简单的栗子:
var v='Hello World';
(function(){
alert(v); //undefined
var v='I love you';
})()
变量提升:
预编译期声明变量不赋值
执行期赋值
(function() {
var a = 'One';
var b = 'Two';
var c = 'Three';
})()
等价于
(function() {
var a, b, c;
a = 'One';
b = 'Two';
c = 'Three';
})()
函数提升
函数提升是把整个函数都提到前面去
函数表达式
var a=function(){}
函数声明式
function a(){})
重点:只有"函数声明形式"才能被提升。
函数声明:
function myTest(){
foo(); //这里成功
function foo(){
alert("我来自 foo");
}
}
myTest();
函数表达式:
function myTest(){
foo(); //foo is not a function
var foo =function foo(){
alert("我来自 foo");
}
}
myTest();