常用的setTimeout方法和它的第三+个参数

263 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天

setTimeout()是我们常用方法,一般用来在指定的毫秒数后延迟调用函数或语句,语法格式如下:

setTimeout(延迟执行的代码, 延迟的毫秒数<默认为0>)
//延迟执行语句
setTimeout("console.log('hello')", 3000);//三秒后在控制台输出字符串hello,执行的语句可以引号包裹,也可以没有
//延迟执行函数
setTimeout(fun(), 3000);//三秒后执行fun函数,函数名不能用引号包裹起来,并且如果函数没有参数,可以省略小括号

setTimeout方法有一个Number类型的返回值,可以作为它的ID标识符,用clearTimeout(ID)可以终止计数:

let a = setTimeout("fun()", 3000);

今天在学习Promise时,翻开阮一峰大神的《ES6标准入门》,其中有一个案例让我陷入了思考:

function timeout(ms){
  return new Promise((resolve, reject) => {
    setTimeout(resolve, ms, 'done');
  });
}

这里的setTimeout传入了三个参数: 第一个参数:resolve是方法

第二个参数:ms是延迟的时间

那这第三个参数是什么呢?

在源码中,对setTimeout方法的声明是:

declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number;

这里标出了:...arguments,原来它不止能传三个参数,而是能后续传无限个参数进去

再查阅文档,明白了它的用法:除去前两个固定参数,第三个及以后的参数会作为第一个方法的参数传入

所以我们这两种写法是等价的:

    setTimeout(fun, ms, 'done');

等价于↓

    setTimeout(fun('done'), ms);

但要注意:这种传参方式在IE9及更低的版本不起作用