我们习惯将 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;
这样就容易理解了。
网友评论