变量提升
变量提升是 JavaScript
在运行时的一种机制。
变量提升这一特性就是在准备执行上下文时进行的,这一特性也是和执行上下文相关的最常在面试中出现的内容。
1. 表现
说明 number
变量在第一行输出之前就已经存在了,只不过没有被赋值,因为如果变量不存在,访问变量会抛出异常:ReferenceError: 变量 is not defined
。
可是在第一次使用 number
之前并没有声明过变量,却可以被访问到,出现这个表现就是因为变量提升的特性。
在生成执行上下文阶段,会把变量都收集起来,事先进行声明,需要注意的是,这个特性只会声明变量,而不会初始化,即变量的值都会是 undefined
。
根据这个规则,上面这段代码在执行时可以理解成是这样的:
var number;
console.log(number);
number = ;
console.log(number);
需要注意的是,如果没有使用 var
关键字声明变量,是不会进行提升处理的。
console.log(number);
number = ;
console.log(number);
这样就会抛出变量不存在的异常。
2. 函数提升
fn('咕咕咕');
function fn(str) {
console.log(str);
}
console.log(fn); // 输出:undefined
fn('咕咕咕'); // 抛出异常 TypeError: fn is not a function
var fn = function(str) {
console.log(str);
};