美文网首页
预编译阶段变量函数的提升 和 多个函数的执行顺序

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

作者: AAA前端 | 来源:发表于2021-07-08 10:19 被阅读0次

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

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

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

相关文章

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

    下面这道题讲解变量和函数的提升 预编译js的变量对象 AO对象 让js引擎去访问1、创建AO对象2、找形参和变量的...

  • 变量提升(mdn自学)

    变量提升是变量和函数的声明编译阶段被放入内存中JavaScript 在执行任何代码段之前,将函数声明放入内存中的优...

  • C++构造和析构调用顺序

    构造函数执行顺序 1.基类构造函数(如有多个则按基类声明顺序从左到右) 2.成员变量构造函数(如果有多个按成员变量...

  • js函数

    函数 函数就是重复执行的代码片。函数定义与执行 变量与函数预解析: JavaScript解析过程分为两个阶段,先是...

  • js函数

    函数 函数就是重复执行的代码片。函数定义与执行 变量与函数预解析: JavaScript解析过程分为两个阶段,先是...

  • 作用域以及变量提升

    函数的作用域 从函数定义到执行: 1.编译 2.执行。函数的作用于在编译时就已经决定了。 变量提升之 - - 先有...

  • 多个装饰器存在时的执行顺序

    装饰器的执行顺序是怎样的? 装饰器函数的执行顺序分为定义阶段和执行阶段,装饰器函数在被装饰函数定义好后立即执行 在...

  • 组合挂起函数

    挂起函数调用顺序 在协程中顺序调用多个挂起函数 这多个挂起函数执行的顺序和常规代码中一样 默认都是顺序执行的常规代...

  • 浏览器学习笔记-JS执行

    变量提升 变量提升原理浏览器对js是先编译后执行,在编译过程中,js中的变量声明会被提升到代码段落前面。函数声明和...

  • JavaScript 预编译

    预编译发生在什么时候 预编译发生在函数执行的前一刻 一. 预编译的抽象理解 函数声明整体提升变量,声明提升 举个例...

网友评论

      本文标题:预编译阶段变量函数的提升 和 多个函数的执行顺序

      本文链接:https://www.haomeiwen.com/subject/srizultx.html