现象
先上一个 javascript
变量提升的案例
console.log(a);
var a = 10;
正常来说,按照代码从上往下执行的逻辑思维,这里 console.log(a)
应该报错
Uncaught ReferenceError: a is not defined
,但事实上输出值为 undefined
,也就是说 javascript
引擎认为这个 a
变量是已声明,但未赋值而已。
原理
javascript
引擎声明、执行是两个步骤,声明都是在执行前面处理的,所以在代码的任意位置声明总是相当于在代码开头声明,函数赋值是在执行阶段处理的,也就是说 var a = 10;
是分为两个步骤完成
var a;
a = 10;
因此,变量声明是一种提升的处理,所以叫变量提升。变量提升不管在什么作用域中都一样存在(ES6 中的 let
不存在),且函数调用也一样成立
test(); // 1111
function test(){
console.log(1111);
}
然而,编程体验性也很重要,因此最好是先声明后调用,养成良好的编程习惯。