Js的执行并不是由上向下一行一行顺序下来的,一个例子如下:
a = 2; var a ; console.log(a) //
输出的是2,这区别于别的语言。
再一个例子:
console.log(a); //undefined var a = 2;
输出的是undefined。
由var a = 2;
Js的引擎机制是先编译,再执 ,先从编译器说起,编译过程中,我们知道编译会先根据声明为其确定作用域。上面的例子中实际上编译器会将其看成两个声明,分别为var a;和a =2。因为事先需要确定作用域,所以var a;在编译过程中就已经执行,而赋值操作a =2;就会留在原地等待正常顺序的执行。所以上面的两个例子可以看成如下:
第一个: var a; a = 2; console.log(a); 第二个: var a; console.log(a); a = 2;
上面的这种提前声明则被称作为提升。提升在每个作用域中都存在,如下:
var a; function foo(){ b = 2; console.log(b); // var b; }
可以理解为如下:
var a; function foo(){ var b; b = 2; console.log(b); // }
另外假如重复声明的话,后面的声明会覆盖前面的声明,函数声明会覆盖变量声明。如下:
foo(); // function foo(){ console.log(2) }; function foo(){ console.log(3) };
后面的声明覆盖了前面。
foo(); // function foo(){ console.log(2); }; var foo;
函数声明覆盖了变量声明。
由于Js特别的机制,书写过程中应该尽量避免重复声明。