第4章 变量提升

先有蛋(声明),后有鸡(赋值)

/*一*/
a = 2;
var a;
console.log(a) // 2

//实际情况
var a;  // 代表代码 执行前 编译 过程中的 变量声明
a = 2;// 代表 代码执行时的 赋值声明
console.log(a) // 2
/* 二 */ 
console.log(a) // undefined
var a = 2;

//实际情况
var a;// 编译过程 变量提升
console.log(a) 
a = 2; // 执行过程 的代码,原地等候

变量声明 属于 编译 过程,赋值声明属于 执行 过程,编译执行 前。

foo();

function foo(){
  console.log( a ); // undefined
  var a = 2;
}

// 实际情况

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

foo()

变量提升 只会提升至 当前作用域,而不会提升至最外层(全局作用域)

函数优先

foo(); // 1
var foo;

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

// 实际情况
function foo (){
  console.log( 1 );
}

var foo;

foo(); // 1

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

foo函数声明foo变量声明

// 同类提升会被覆盖
foo(); // 3

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

后面的函数声明 会覆盖掉 前面的函数声明

你可能感兴趣的:(第4章 变量提升)