JS 函数的调用机会

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

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

let i = 0for(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 = 0for(i = 0; i < 6; i++){  const x = i  setTimeout(()=>{    console.log(x)  })}

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

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