预编译阶段变量函数的提升 和 多个函数的执行顺序

2021-07-08  本文已影响0人  AAA前端

下面这道题讲解变量和函数的提升

function fn(a, c){
  console.log('a', a)
  var a = 123
  console.log('a', a)
  console.log('c', c);
  function a(){}
  if(false){
    var d = 678
  }
  console.log('d', d);
  console.log('b', b);
  var b = function(){}
  console.log('b', b);
  function c(){}
  console.log('c', c);
}
fn(1, 2)

预编译
js的变量对象 AO对象 让js引擎去访问
1、创建AO对象
2、找形参和变量的申明
3、实参和形参相统一
4、找函数申明 会覆盖变量的申明

// 1 创建AO对象
AO = {

}
// 2找形参和变量(变量会提升)
AO = {
  a: undefined,
  c: undefined,
  d: undefined,  // 虽然有判断false, 在预编译阶段也会变量提升
  b: undefined,
}
// 3 实参和形参相统一  (如果fn函数里面没有 函数 a和 函数c ,执行函数时,打印就会打印 1,2了)
AO = {
  a: 1,
  c: 2,
  d: undefined,  // 虽然有判断false, 在预编译阶段也会变量提升
  b: undefined,
}
// 4 找函数申明 会覆盖变量的申明
AO = {
  a: function a(){},
  c: function c(){},
  d: undefined,  // 虽然有判断false, 在预编译阶段也会变量提升
  b: undefined,
}

// 打印的结果

// a ƒ a(){}
// a 123
// c ƒ c(){}
// d undefined
// b undefined
// b ƒ (){}
// c ƒ c(){}

如果没有函数重新覆盖的情况下,会打印形参的例子


function fn(a, b){
  console.log(a)
  console.log(b)
  var a = 11
  var b = 12
}
fn(1, 2)

// 打印的结果
// 1
// 2

多个函数的执行顺序

function fn1(){
  console.log('1111');
  fn2()
}
function fn2() {
  console.log('2222');
}
function fn3() {
  console.log('3333');
  fn4()
}
function fn4() {
  console.log('4444');
}
fn1()
fn3()

打印的是1111 2222 3333 4444

再看一个

function fn1(){
  console.log('1111');
  setTimeout(() => {
    fn2()
  }, 0);  
}
function fn2() {
  console.log('2222');
}

function fn3() {
  console.log('3333');
  fn4()
}
function fn4() {
  console.log('4443');
}
fn1()
fn3()

打印1111 3333 4444 2222


var i = 1;
function fn1(){
  console.log('1111');
  if(i++<100){
    fn1()
  }  
}
function fn2() {
  console.log('2222');
}

fn1()
fn2()

打印的是 1111 1111 1111 。。。。。。。 2222

可以看出只要函数里面没有异步任务, 函数会一直执行下去,知道函数执行完,才会执行接下来的函数。

上一篇 下一篇

猜你喜欢

热点阅读