持续创作,加速成长!这是我参与「掘金日新计划 · 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及更低的版本不起作用