javascript 中settimeout()的第三个参数的使用

发布网友 发布时间:2022-04-23 00:25

我来回答

7个回答

懂视网 时间:2022-04-29 14:11

setTimeout居然还有第三个参数?

说起setTimeout,各位再熟悉不过,用法也很简单:setTimeout(fun, delay)。

但说起来你可能不信,用了这么多年的setTimeout居然有第三个参数。下面一起看看这个setTimeout第三个参数。

【相关课程推荐:JavaScript视频教程】

我们先来看一段简单的代码:

setTimeout(function(x) {
 console.log(x);
}, 1000, 1);

控制台输出1,那么能不能继续加参数呢?我们继续来看下面这段代码:

setTimeout(function(x,y) {
 console.log(x+y);
}, 1000, 1, 2);

控制台输出的是3,很显然是第三和第四个参数的和。

看到这里很多小伙伴应该意识到了,是的,setTimeout的第三个参数作用就是给setTimeout第一个函数的参数。

通过查询MDN https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout 我们能看到关于第三个参数的描述:

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代码 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%,这里贴出传送门,感兴趣的可以去看。

下面是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).

本文来自 js教程 栏目,欢迎学习!

热心网友 时间:2022-04-29 11:19

setTimeout(func, delay, param1, param2, ...)后面的param1等都作第一个函数func的参数传进去。

例子:

setTimeout( function( a, b ,c ) {
    console.log( a );//1
    console.log( b );//2
    console.log( c );//3
}, 1000, 1, 2, 3 );

热心网友 时间:2022-04-29 12:37

第三个参数 lang[可选]:脚本语言类型 很少使用 应该是可以运行其他语言的脚本的意思 比如 VB .. (只能运行在IE 下面).. 意思是说 的事件见到了运行一段代码, 这段代码 是VB 写成的..

热心网友 时间:2022-04-29 14:11

原型:setTimeout(code,millisec,lang)-------------------------------------------code[必须]:指定函数或是要执行的代码millisec[必须]:执行代码所要等待的毫秒数lang[可选]:脚本语言类型:JScript | VBScript | JavaScript例子:setTimeout("alert(123)",1000,"JavaScript"); 不过在实际使用中,lang(第三个参数)几乎被忽略了。

第三个参数:lang[可选]:脚本语言类型:JScript | VBScript | JavaScript

热心网友 时间:2022-04-29 16:03

没有第三个参数吧。

热心网友 时间:2022-04-29 18:11

原型:setTimeout(code,millisec,lang)-------------------------------------------code[必须]:指定函数或是要执行的代码millisec[必须]:执行代码所要等待的毫秒数lang[可选]:脚本语言类型:JScript | VBScript | JavaScript例子:setTimeout("alert(123)",1000,"JavaScript"); 不过在实际使用中,lang(第三个参数)几乎被忽略了。

热心网友 时间:2022-04-29 20:35

建议不要使用该方法,内存溢出使用setInterval方法 效果是一样的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com