写代码啦
js调用时机
回复数(0) 浏览数(31)
{{topic.upvote_count || 0}} 编辑 回复

函数什么时候执行

函数是在有括号的情况下才会执行的

// 这个是定义

function fn(){
    console.log(a)
}

下面这个才是执行:

function fn(){
    console.log(a)
}
fn()

函数执行顺序

按照语句顺序执行

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

执行代码会发现最后打印6个6,仿佛这个是和正常的自觉相悖的。曾经很长一段时间,我也觉得这个结果是错误的。在这里,循环设置了6个setTimeout定时器,等宏任务的语句执行完成后,setTimeout中开始执行新一轮的宏任务,就会按照语句打印6次console.log(i),这个时候因为宏任务执行完成后的i的值是6,所以最后就会打印6次6

如果想输出0到5的话,如下:

// 使用let
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

// 绑定参数, 这里利用的闭包
for(var i = 0; i<6; i++){
    (function(i){
        setTimeout(()=>{
            console.log(i)
          },0)
    })(i)
}
{{topic.upvote_count || 0}}

函数什么时候执行

函数是在有括号的情况下才会执行的

// 这个是定义

function fn(){
    console.log(a)
}

下面这个才是执行:

function fn(){
    console.log(a)
}
fn()

函数执行顺序

按照语句顺序执行

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

执行代码会发现最后打印6个6,仿佛这个是和正常的自觉相悖的。曾经很长一段时间,我也觉得这个结果是错误的。在这里,循环设置了6个setTimeout定时器,等宏任务的语句执行完成后,setTimeout中开始执行新一轮的宏任务,就会按照语句打印6次console.log(i),这个时候因为宏任务执行完成后的i的值是6,所以最后就会打印6次6

如果想输出0到5的话,如下:

// 使用let
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

// 绑定参数, 这里利用的闭包
for(var i = 0; i<6; i++){
    (function(i){
        setTimeout(()=>{
            console.log(i)
          },0)
    })(i)
}
31
回复 编辑