在非严格模式下,JavaScript中存在变量提升的特点。
1. 原因
JavaScript的工作原理是先编译再执行,在编译过程中,解释器会把所有声明“移动”到所在作用域的最上面,而赋值或其他逻辑会留在原地,这就是变量提升。
例如
foo(); function foo(){ console.log(a); // undefined var a = 2; }
在编译后将被理解为下面的形式
function foo(){ var a; console.log(a); // undefined a = 2; } foo();
2.函数优先
在提升过程中,函数声明将首先提升,然后才是变量。只有函数声明( function a(){} )才会被提升,函数表达式( var a = function b(){} )不会提升。如果存在相同的声明,相同的变量声明将被忽略;相同的函数声明,后面的将会覆盖前面的。
例如
foo(); // 1 var foo; function foo(){ console.log(1); } foo = function(){ console.log(2); }
将被理解为
function foo(){ console.log(1); } foo(); // 1 foo = function(){ console.log(2); }