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