JavaScript 变量声明提升

在 JavaScript 中,变量声明函数声明会被引擎隐式地提升到当前作用域的顶部。

如:

var b = 1;
function a() {
console.log(typeof b);
var b = 3;
}
a();

输出的结果会是:undefined. 而不是 1。

这就是因为变量 b 的声明被提前了,typeof 操作符操作的变量不是全局变量 b;而是待赋值的局部变量 b。

同理,函数的声明也如此:

var foo = function(){
console.log(1);
}
function f1() {
console.log(typeof foo); // "function"
}
function f2() {
console.log(typeof foo); // "undefined"
var foo = function(){
console.log(2);
}
}

但是直接定义的话就不会为 undefined。

(function(){
console.log(foo);
function foo(){
console.log("this is ain't a function for the broken-hearted.");
};
})();

附上两道据说2014年阿狸笔试题:

var v = "Hello world";
(function() {
console.log(v);
var v = "I love you";
bar();
foo();
function bar(){
console.log("this is bar!");
}
var foo = function() {
console.log("this is foo!");
};
})();
// Result: undefined; "this is bar!"; foo is not a function
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = 11;
}
alert(typeof bar());
// Result: "function"