声明提前

Tags
javascript
Created
Aug 3, 2018 10:12 AM
  1. var 声明变量时声明提前,并初始化成 undefined,赋值还在原来的位置。(let, const 声明时未进行初始化,不能使用
  2. function 声明函数都会提前(可以在前面执行)
  3. Class 没有声明提前(相当于 let 定义)(Class 也可以用表达式定义)
var a = 0;
{
  a = 1; // 赋值给下面的 function a

  console.log(a, window.a); // 1,0
  // 非严格模式可以在语句块定义函数
  // 声明提前到语句块外面,函数体提前到块内最前面(且块内不能重新声明 var a),但和 var 一样执行到这里才将局部 a 的值赋值给外面的 a
  function a() {}
  console.log(a, window.a); // 1,1
}

foo();

var foo = 0;

function foo(){ console.log(1);}

foo = function(){ console.log(2);};

用 var 声明的变量和命名函数都会被提升到代码的最前面,只不过声明的变量的赋值语句在代码中的位置不变。所以上面这段代码应该被理解为:

var foo;

function foo(){ console.log(1);}

foo();

foo = 0;

foo = function(){ console.log(2);};

SuperMade with Super