变量提拔的道理

当顺序实行这一段代码时

console.log(a);
var a = 2;

有履历的同砚都晓得控制台会输出undefined而不是报错a is not defined
这是由于此时发生了变量提拔,代码能够理解为以下情势

var a;
console.log(a);// undefined
a = 2;

这是为何呢,让我先申明以下几点

  • 一段JavaScript代码,是先由编译器编译成可实行代码,再交给引擎去实行的。
  • var症结字声明的变量是在编译阶段声明的。

每当编译器碰到var xxx,都会去查找当前作用域是不是已存在变量xxx,假如xxx已存在,则疏忽该声明,反之,在当前作用域声明变量xxx
所以当做顺序实行下面代码时

console.log(a);
var a = 2;
  1. 起首编译器查找当前作用域是不是存在变量a,发明a并不存在,声明变量a
  2. 再由引擎实行由编译器天生的代码console.log(a),此时变量a已被编译器声明,然则还未被赋值,所以此时控制台输出的值是undefined
  3. a = 2,此时变量a的值为2。

实在症结点就在于,由var症结字声明的变量是在编译阶段声明的,所以会涌现变量提拔的状况。
然则编译器对ES6语法中的constlet症结字声明的变量则不会提早声明,所以不会涌现变量提拔。

    原文作者:evaz
    原文地址: https://segmentfault.com/a/1190000017417681
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞