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