JavaScript预编译

2021-03-13  本文已影响0人  Lnevan

预编译前奏

//赋值都是自右向左,所以b是未经声明的变量,归window所有
function test() {
  var a = b = 123
}
test()
console.log(window.b) //123
console.log(window.a) //undefined

预编译

function fn(a) {
  console.log(a) //function a() {}
  var a = 123
  console.log(a) //123  此时变量已经提升,a会被新赋值为123
  function a() {}
  console.log(a) //123 function a() {}已经被提升
  var b = function() {}
  console.log(b) //function b() {} var b已经被提升,b被新赋值为function
  function d() {} 
}
fn(1)

例子1

function test(a,b) {
  console.log(a) //1
  c = 0
  var c
  a = 3
  b = 2
  console.log(b) //2
  function b() {}
  function d() {}
  console.log(b) //2
}
// test(1)
// AO {                  
//   a : undefined,
//   b : undefined,
//   c : undefined
// }
// -->
// AO {
//   a : 1,
//   b : function,
//   c : undefined,
//   d : function
// }
// 到执行的时候:
// AO {
//   a : 3,
//   b : 2,
//   c : 0,
//   d : function
// }

例子2

function test() {
  console.log(a) //function
  console.log(b) //undefined
  var b = 234
  console.log(b) //234
  a = 123
  console.log(a) //123
  function a() {}
  var a
  b = 234
  var b = function() {}
  console.log(a) //123
  console.log(b) //function
}
test(1)
// 预执行:
// AO {
//   a : undefined,
//   b : undefined
// }
// -->
// AO {
//   a : 1,
//   b : undefined
// }
// -->
// AO {
//   a : function
//   b : undefined
// }

注:

console.log(test) //function
function test(test) {
  console.log(test) //function
  var test = 234
  console.log(test) //234
  function test() {}
}
function fn() {
  console.log(global) //undefined
  global = 200
  console.log(global) // 200
  var global = 300
}
fn()
var global
// GO {
//   global : 100
// }
// AO {
//   global : undefined
// }
// -->
// AO {
//   global : 200
// }
function test() {
  console.log(b) //undefined
  if(a) {
    var b = 100
  }
  console.log(b) //undefined
  console.log(c) //234
}
var a
test()
a = 10
console.log(c) //234
上一篇下一篇

猜你喜欢

热点阅读