[AppleScript] 纯文本查看 复制代码
let nowTime = Date.now()
console.log("现在的时间:" + nowTime) // 1581391609874
setTimeout(function(){
console.log("之后的时间:" + (Date.now() - nowTime)) // 116
}, 100)
for (let i = 0; i < 9999; i++) { // 耗时任务
}
通过代码可以看出,首先输出当前时间nowTime,然后通过定时器延迟100毫秒后输出延迟后的时间与nowTime的时间差。按照定时器的设定,他们的差值应该为100,但实际输出为116,这是为什么?
这是因为JavaScript引擎执行代码的基本流程是先执行初始化代码,包括一些特别的代码,比如设置定时器,绑定监听,发送ajax等。等初始化代码执行完成后才可能执行回调代码(异步)。
上述代码先执行除了定时器回调function以外的代码,然后再执行function,导致执行过程在for循环中浪费了部分时间,等for循环执行完后才会执行定时器回调function,所以才会出现16毫秒的偏差。
而如果是多线程的话,当遇到定时器或者耗时任务时,可能会再次开启一个线程去单独执行对应的定时器或耗时任务,肯定不会像JavaScript一样出现阻塞,这个例子可以验证JavaScript是单线程。
再看一个例子
setTimeout(function(){
console.log("1s后执行")
}, 1000)
function func() {
console.log("func()")
}
func() // func()
alert('阻断')
console.log(123123)
[AppleScript] 纯文本查看 复制代码
let nowTime = Date.now()
console.log("现在的时间:" + nowTime) // 1581391609874
setTimeout(function(){
console.log("之后的时间:" + (Date.now() - nowTime)) // 126
}, 100)
for (let i = 0; i < 9999; i++) { // 耗时任务
}