变量提升和函数提升

2019-04-10  本文已影响0人  阿拉斯加南海岸线

我们习惯将 var a = 2; 看作一个声明,实际上javascript引擎并不这么认为。它将 var a; 和 a = 2; 看作两个单独的声明。第一个是编译阶段的任务,第二个是执行阶段的任务。
这意味着无论作用域中的声明出现在什么位置,都将在代码被执行前首先进行处理。可以将这个过程形象的想象成所有的声明(变量和函数)都会被移动到各自作用域的最顶端,这个过程被称为提升
函数声明和变量声明都会提升,但函数优先提升。注意的是,函数声明会提升,函数表达式却不会。
声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。
要避免重复声明。

看看以下两段代码,结果是多少?
第一段:

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

第二段:

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

第一段很多开发者会认为是 undefined, 因为 var a 声明在 a = 2 之后, 他们自然而然地认为变量
被重新赋值了, 因此会被赋予默认值 undefined。 但是, 真正的输出结果是 2。
第二段中,鉴于上一个代码片段所表现出来的某种非自上而下的行为特点, 你可能会认为这个代码片
段也会有同样的行为而输出 2。 还有人可能会认为, 由于变量 a 在使用前没有先进行声明,
因此会抛出 ReferenceError 异常。
不幸的是两种猜测都是不对的。 输出来的会是 undefined。

结合前面提到的理论知识,可以将这两段代码看成如下:
第一段:

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

第二段:

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

这样就容易理解了。

上一篇 下一篇

猜你喜欢

热点阅读