概念
变量提升意味着在JavaScript中,无论变量在何处声明(在函数内部或全局作用域中),它都会被提升到其所在作用域的顶部。但是,只有变量的声明会被提升,而变量的赋值不会。
例如:
console.log(x); // undefined,而不是ReferenceError
var x = 10;
变量提升后
var x;
console.log(x); // undefined
x = 10;
与变量提升类似,函数声明也会被提升到其所在作用域的顶部。但需要注意的是,函数声明的提升优先级高于变量声明。
函数提升有两种形式:函数声明(Function Declaration)和函数表达式(Function Expression)。但需要注意的是,只有函数声明会被提升,函数表达式(即赋值给一个变量的函数)不会被提升。
函数声明
console.log(myFunction()); // "Hello, World!"
function myFunction() {
return "Hello, World!";
}
提升后
function myFunction() {
return "Hello, World!";
}
console.log(myFunction()); // "Hello, World!"
函数表达式
console.log(myFunction()); // TypeError: myFunction is not a function
var myFunction = function() {
return "Hello, World!";
};
提升后
var myFunction;
console.log(myFunction()); // TypeError: myFunction is not a function
myFunction = function() {
return "Hello, World!";
};
练习(经典面试题)
第一道
fn();
function fn() { console.log(1); }
fn();
function fn() { console.log(2); }
fn();
var fn = function () { console.log(3); }
fn();
function fn() { console.log(4); }
fn();
function fn() { console.log(5); }
fn();
第二道
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();
第三道
var a = 0;
if (true) {
a = 1;
function a() {};
a = 21;
console.log(a)
}
console.log(a);