ES5和ES6中的变量声明提拔

ES5和ES6中的变量声明提拔

Example1:

a=2;
var a;
console.log( a );   //结果为2

Example2:

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

Example2:

foo();  //结果是1
var foo;
foo = function() { 
    console.log( 2 );
};
function foo() { 
    console.log( 1 );
}

道明白读:浏览器引擎在运转顺序分为两个阶段:第一个的阶段是编译阶段,该阶段担任找出代码中一切的定义声明(包含变量和函数),并关联到适宜的作用域中;第二阶段是实行阶段,该阶段担任找出代码中的一切赋值声明,并在作用域找找到第一阶段的定义声明,以供运用。
代码解读
第一个例子在编译阶段会将var a;这句定义声明起首解读关联到全局作用域中,所以当在赋值声明阶段实行a=2;console.log(a);这两个赋值声明的代码时是一般实行的,也就有了定义声明提早了的觉得。

第二个例子也同样是第一阶段先解读了var a,这部份定义声明,接着在第二阶段的时刻实行console.log(a);的时刻报undefined,说明虽然定义声明虽然提早了,但是赋值声明a=2;这部份依然未提早。

第三个例子在编译阶段会将 var foo;变量定义声明和 function foo(){…}函数定义声明提早,然后在第二阶段实行foo();赋值声明,这里须要注重的是在这类变量和函数反复声明的状况,函数定义说明会被提更前,缘由倒不是真的是提早了,而只是在赋值声明的时刻起首会去方法域中寻觅,然后才去变量域中寻觅,所以致使看起来是函数说明比变量声明更提早了。

结论:关于JS中所说的变量声明提早,更正确的说法是变量定义声明提早了,更正确的明白是定义声明处于顺序运转的第一个阶段致使相较于赋值声明的第二阶段有了条件的结果。

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