你不知道的setTimeout第三个参数
你不知道的setTimout第三个参数
说起setTimeout,各位再熟悉不过,用法也很简单:setTimeout(fun, delay)。
但说起来你可能不信,用了这么多年的setTimeout居然有第三个参数。下面一起看看这个setTimeout第三个参数。
我们先来看一段简单的代码:
setTimeout(function(x) {
console.log(x);
}, 1000, 1);
控制台输出1,那么能不能继续加参数呢?我们继续来看下面这段代码:
setTimeout(function(x,y) {
console.log(x+y);
}, 1000, 1, 2);
控制台输出的是3,很显然是第三和第四个参数的和。
看到这里很多小伙伴应该意识到了,是的,setTimeout的第三个参数作用就是给setTimeout第一个函数的参数。
通过查询MDN(点击此传送门),我们能看到关于第三个参数的描述:
var timeoutID = scope.setTimeout(function[, delay, arg1, arg2, ...]);
var timeoutID = scope.setTimeout(function[, delay]);
var timeoutID = scope.setTimeout(code[, delay]);
所以,其实准确来讲,setTimeout可以有无数个参数,只是从第三个参数起,就是可选参数了。
好了,知道这个特性后我们可以解决什么问题呢?最经典的一个就是for循环内使用setTimeout了。
for(var i = 0; i<6; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
上面的这个例子是一个经典的面试题,它会连续输出6次6,因为setTimeout是一个异步操作,而等到执行setTimeout时,for循环已经执行完毕,这时的i已经等于6,所以输出6次的6。关于解决方法我总结了好几种,感兴趣的小伙伴可以看我的上一篇博客《关于for循环中使用setTimeout》,在这篇博客结尾我提到了使用setTimeout第三个参数,那我们再来看看这种方法。
for(var i=0;i<6;i++) {
setTimeout(function(j) {
console.log(j);
}, 1000, i);
}
由于每次传入的参数是从for循环里面取到的值,所以会依次输出0~5。这当然还是作用域的问题,但是在这里setTimeout第三个参数却把i的值给保存了下来。这种解决方法比使用闭包轻快的多。
另外,第三个参数也可以作为函数来使用。
for(var i=0;i<6;i++) {
setTimeout(function(j) {
console.log(j);
}, 1000, i);
}
最后依次输出为,第一次0、第二次1。
可以看到第三个参数还可以是先执行,然后再执行函数。
最后,使用第三个参数需要注意的一点就是兼容问题,如果需要兼容IE9及以前的版本,需要引入一段MDN提供的兼容旧IE代码 ,这里贴出传送门,感兴趣的可以去看。
下面是MDN上关于兼容性的描述:
Note: Passing additional arguments to the function in the first syntax does not work in Internet Explorer 9 and below. If you want to enable this functionality on that browser, you must use a polyfill (see the Polyfill section).
你不知道的setTimeout第三个参数的更多相关文章
- setTimeout 第三个参数 改变setTimeout的作用对象 控制下拉框的关闭
setTimeout第三个参数,可以作为setTimeout延时执行函数的传入参数使用,利用这个设定,我们可以将要延时改变状态的对象传入,变相改变setTimeout的作用对象:这里setTimeou ...
- setTimeout 第三个参数秒懂
好吧,假设你们都是从 ES6 里 promise 发现 setTimeout 还有第三个参数的,下面讲讲到底是干嘛的 setTimeout 第三个及之后的参数作用:定时器启动时候,第三个以后的参数是作 ...
- js中的setTimeout第三个参数
setTimeout跟setInterval大家应该都很熟悉的,但是一直很少注意,原来这两个函数可以支持第三个参数的,但是IE就呵呵了,仅IE(6-9)呵呵了,其他浏览器都支持的。 第三个参数将作为回 ...
- setTimeout第三个参数
在廖雪峰大神的官方网站看nodejs的时候,发现自己对Promise函数不甚了解,于是转去看Promise函数,看到了这段代码: function multiply(input) { return n ...
- setTimeout、setInterval被遗忘的第三个参数
一.最近在看promise,惊奇的发现:原来 setTimeout不只有两个参数,我还能说什么呢?赶紧探探究竟. function multiply(input) { return new Promi ...
- setInterval()、clearInterval()、setTimeout()和clearTimeout() js计数器方法(还有第三个参数)
用法是会用,但是之前一直以为接函数的 var a = setInterval(function(){},1000) 比如a是函数名,最近才发现它是一个ID, var intervalID = wind ...
- setTimeout的第三个参数
最熟悉的地方,往往会忽略一些细节.就比如 setTimeout 函数,做前端开发的同学都会很熟悉这个函数,经常使用这个函数,但是知道这个函数还有第三个参数的小伙伴可能就不多了.起码我在阅读阮老师的 e ...
- setInterval、setTimeout之遗忘的第三个参数
今天看阮一峰老师的ES6入门,在一个关于promise的小demo里,老师用到了setTimeout的第三个参数,惊了有没有,定时器还有第三个参数? 喏就是下面这个demo: function tim ...
- setTimeout还有第三个参数
今天才发现setTimeout还有第三个参数. for (var i = 0; i< 10; i++){ setTimeout((i) => { console.log(i); }, 10 ...
随机推荐
- python中@property装饰器的使用
目录 python中@property装饰器的使用 1.引出问题 2.初步改善 3.使用@property 4.解析@property 5.总结 python中@property装饰器的使用 1.引出 ...
- 【GIT】下载最新库命令
使用技巧:使用这个命令 git clone git仓库地址 --depth=1 这样只下载最新版本仓库,而不是所有历史版本的仓库
- MIT线性代数:8.求解Ax=b,可解性和结构
- MinIO 搭建
MinIO 搭建 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务.它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文 ...
- android内嵌H5页(webview)如何定位
一.切换至webview后再定位元素 (1)获取页面上下文 contexts = driver.contexts (2)切换至webview driver.switch_to.context(cont ...
- 『题解』Codeforces656E Out of Controls
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description You are given a complete undirected gr ...
- Uva 227-Puzzle 解题报告
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- vue ui九宫格、底部导航、新闻列表、跨域访问
一. 九宫格 九宫格:在mint-ui组件库基于vue框架 mui不是基于vue框架 只是css/js文件 (1)官方网站下载安装包 (2)copy css js fonts[字体图标] src/l ...
- IDEA快捷键汇总
[常用] Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更 ...
- 详解JavaScript错误捕获和上报流程
怎么捕获错误并且处理,是一门语言必备的知识.在JavaScript中也是如此. 那怎么捕获错误呢?初看好像很简单,try-catch就可以了嘛!但是有的时候我们发现情况却繁多复杂. Q1: 同步可以t ...