本文摘自PHP中文网,作者angryTom,侵删。
说起setTimeout,各位再熟悉不过,用法也很简单:setTimeout(fun, delay)。
但说起来你可能不信,用了这么多年的setTimeout居然有第三个参数。下面一起看看这个setTimeout第三个参数。
【相关课程推荐:JavaScript视频教程】
我们先来看一段简单的代码:
1 2 3 |
|
控制台输出1,那么能不能继续加参数呢?我们继续来看下面这段代码:
1 2 3 |
|
控制台输出的是3,很显然是第三和第四个参数的和。
看到这里很多小伙伴应该意识到了,是的,setTimeout的第三个参数作用就是给setTimeout第一个函数的参数。
通过查询MDN https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout 我们能看到关于第三个参数的描述:
1 2 3 |
|
所以,其实准确来讲,setTimeout可以有无数个参数,只是从第三个参数起,就是可选参数了。
好了,知道这个特性后我们可以解决什么问题呢?最经典的一个就是for循环内使用setTimeout了。
1 2 3 4 5 |
|
上面的这个例子是一个经典的面试题,它会连续输出6次6,因为setTimeout是一个异步操作,而等到执行setTimeout时,for循环已经执行完毕,这时的i已经等于6,所以输出6次的6。关于解决方法我总结了好几种,感兴趣的小伙伴可以看我的上一篇博客《关于for循环中使用setTimeout》,在这篇博客结尾我提到了使用setTimeout第三个参数,那我们再来看看这种方法。
1 2 3 4 5 |
|
由于每次传入的参数是从for循环里面取到的值,所以会依次输出0~5。这当然还是作用域的问题,但是在这里setTimeout第三个参数却把i的值给保存了下来。这种解决方法比使用闭包轻快的多。
另外,第三个参数也可以作为函数来使用。
1 2 3 4 5 6 7 8 9 |
|
最后依次输出为,第一次0、第二次1。
可以看到第三个参数还可以是先执行,然后再执行函数。
最后,使用第三个参数需要注意的一点就是兼容问题,如果需要兼容IE9及以前的版本,需要引入一段MDN提供的兼容旧IE代码 https://developer.mozilla.org/zh-CN/docs/Web/API/Window/setTimeout#%E5%85%BC%E5%AE%B9%E6%97%A7%E7%8E%AF%E5%A2%83%EF%BC%88polyfill%EF%BC%89,这里贴出传送门,感兴趣的可以去看。
下面是MDN上关于兼容性的描述:
1 |
|
本文来自 js教程 栏目,欢迎学习!
以上就是setTimeout居然还有第三个参数?的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
setTimeOut和setinterval之间有什么区别?
javascript 中 setTimeOut 函数怎么用?
更多相关阅读请进入《setTimeOut》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者