JS预编译,变量提升的原因

2019-05-08  本文已影响0人  学不动了Zzz

1.imply global 暗示全局变量: 如果变量未经声明就赋值,此变量就归window(全局对象)所有

a = 10
console.log(window.a) // 10

2.一切声明的变量,全是window的属性:全局范围内,var(let、const不会)一个变量,这个变量归window(全局对象)所有。 let、const和var的区别

var a = 10
console.log(window.a) // 10

函数预编译(函数执行的前一刻)

function fn (a) {  
  console.log(a)
  var a = 123
  console.log(a)
  function a () {}
  console.log(a)
}
fn(1)
// 编译后:
function fn (a) {  
  var a
  function a () {}
  console.log(a) // function a () {}
  a = 123
  console.log(a) // 123
  console.log(a) // 123
}
fn(1)
编译过程:

1.创建AO对象(Activation Object :执行期上下文)

AO {
  a: 
}

2.将变量和形参名作为AO属性名,值为undefined

AO {
  a: undefined
}

3.将实参值和形参统一

AO {
  a: 1
}

4.在函数体里面找函数声明,值为函数体(如果函数名和变量或形参名相同,会把之前的值覆盖掉, 所以函数是一等公民)

AO {
  a: function a() {}
}

全局预编译

1.生成一个GO对象 Global Object(就是window)
2.将变量名作为GO属性名,值为undefined
3.在全局中找函数声明,值为函数体(如果函数名和变量或名相同,会把之前的值覆盖掉, 所以函数是一等公民)

上一篇下一篇

猜你喜欢

热点阅读