setTimeout和setInterval是什么就不说了,今天在看ES6的promise的时候,看到代码中setTimeout传递了三个参数。难道这第三个参数是前面函数的参数?
eg:
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});
}
timeout(100).then((value) => {
console.log(value);
});
事实就是如此,于是又上MDN搜了一下。HTML5的标准定时器函数是支持的,但是IE[6-9]不支持,对不支持的IE版本,添加如下代码即可。
// copy from MDN
if (document.all && !window.setTimeout.isPolyfill) {
var __nativeST__ = window.setTimeout;
window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
var aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeST__(vCallback instanceof Function ? function () {
vCallback.apply(null, aArgs);
} : vCallback, nDelay);
};
window.setTimeout.isPolyfill = true;
}
if (document.all && !window.setInterval.isPolyfill) {
var __nativeSI__ = window.setInterval;
window.setInterval = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
var aArgs = Array.prototype.slice.call(arguments, 2);
return __nativeSI__(vCallback instanceof Function ? function () {
vCallback.apply(null, aArgs);
} : vCallback, nDelay);
};
window.setInterval.isPolyfill = true;
}
有了此功能,即解决了回调函数的执行上下文,比如要调用某个对象的某个方法,即可以通过参数把该对象传进去。后面支持多个参数。
还需要注意的是,Chrome等支持的浏览器中,回调函数获取的参数等于传递的参数,但在FireFox中,获取的参数会多一个。处理时,要注意参数个数。
转载请注明带链来源:春语精椿