你不知道的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).

最新文章

  1. HDU1575Tr A(矩阵相乘与快速幂)
  2. void与void *
  3. 解析工具Goson
  4. REST API 安全设计指南
  5. Naive Bayes Algorithm
  6. (转载)javascript经典例子
  7. 斯坦福大学IOS开发课程笔记(第七课第一部分)
  8. Dreamer 3.0 支持json、xml、文件上传
  9. Thinking in scala (5)----高阶函数*
  10. Spring Bean&#39;s life
  11. SpringCloud(9)使用Spring Cloud OAuth2保护微服务系统
  12. JS里的&lt;!-- //--&gt; 注释有什么作用
  13. redis学习笔记01 — 基本介绍、安装配置及常用命令
  14. C++学习(三十六)(C语言部分)之 链表2
  15. JavaWeb学习 (十一)————Session
  16. ES6,Array.copyWithin()函数的用法
  17. animate.css –齐全的CSS3动画库--- 学习笔记
  18. SharePoint 2013 页面中window/document.onload/ready 事件不能触发的解决方案
  19. csdn的一次回答问题
  20. SimpleDateFormat使用详解 &lt;转&gt;

热门文章

  1. 你还在用BeanUtils进行对象属性拷贝?
  2. C++等号操作符重载
  3. RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中如何使用Selenium很全的总结(上)
  4. python爬虫-携程-eleven参数
  5. 20190630A(贪心)
  6. 2018年7月份JAVA开源软件TOP3
  7. Mybatis中多表关联时,怎么利用association优雅写resultMap来映射vo
  8. tcpdump抓包工具
  9. vue-cli中使用less
  10. [内部类] java笔记之内部类