关于javascript:JS-函数的执行时机

5次阅读

共计 1090 个字符,预计需要花费 3 分钟才能阅读完成。

JS 函数的调用机会

  • 函数的因素:
  1. 调用机会:JS 函数的不同执行机会,会影响到函数运行的输入后果,不能通过代码自身百分百判断函数输入什么,而是要依据函数具体的执行机会。
  2. 作用域:每个函数都会默认创立一个作用域
  3. 闭包:JS 函数会就近寻找最近的变量
  4. 形式参数
  5. 返回值
  6. 调用栈:进入一个函数的时候,要先把环境存下来,能力进去,有的货色越多,须要一个数组来保留,那保留的环境所在的数组叫做调用栈
  7. 函数晋升
  8. arguments(除了箭头函数)
  9. this(除了箭头函数)

* 调用机会:机会不同,后果就不同

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

输入:

对于 setTimeout

  • 用于在指定的毫秒数后调用函数或计算表达式;
  • 意思就是尽快执行,而不是马上执行;
  • 能够了解为做完手头的事稍后再执行。

举例说明 setTimeout, 比方小明正在玩游戏,然而妈妈喊小明吃饭,这时小明 setTimeout 答复好的,然而手上的游戏仍继续一段时间后,才执行 console.log 去吃饭这个动作。

解释: setTimeout 是一个异步工作,执行到这里的操作会被浏览器丢到另一个工作队列里去,浏览器这时候会继续执行 for 循环。每一次 for 循环的时候,setTimeout 都执行一次,然而外面的函数没有被执行,而是被放到了工作队列外面,期待执行,for 循环了 6 次,就放了 6 次,当主线程执行实现后,才进入工作队列外面执行。这时候因为 for 循环 i = 6 了,所以输入的全部都是 6。
如何了解异步呢?
异步代码不期待后果,间接进行上面的代码,所以定时器只是开启了,而没有立刻执行外面的代码,等到以后运行坏境的代码执行完之后再回来执行定时器外面的代码。总结:异步就是不期待后果的代码。

因为 setTimeout 的起因,将本来要即时打印的后果提早到 for 循环完结之后,所以这里后果是 for 循环完结才开始打印执行的,且只有 1 个 i,i 的值曾经是 5,再执行 i ++。

所以间断打印了 6 个 6。

如何执行后果是 0,1,2,3,4,5 呢?

办法一:

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

输入:

办法二:利用 const 关键字

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

办法三:利用 setTimeout 的第三个参数, 将 i 传进去

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

正文完
 0