js变量提升

在非严格模式下,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);
}
原文地址:https://www.cnblogs.com/diyichen/p/11183873.html