JavaScript-js中settimeout第三个参数验证

JavaScript-js中settimeout第三个参数验证

灵芸 发布于 2017-01-25 字数 281 浏览 1078 回复 1

setTimeout(function(){

alert(arguments.length);
alert(arguments[0]);
alert(arguments[1]);
alert(arguments[2]);
}, 1000, 1,2);
chrome下弹出是正确的,2,1,2,undefined
而火狐下弹出3,1,2,不确定数字,每次都会变。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

归属感 2017-07-09 1 楼

setTimeout和setInterval函数的第三个参数本来只是定义语言类型,后来在非IE浏览器下支持传递参数,并且在不同浏览器下支持的不同。

原来的setTimeout函数定义:

var timeoutID = window.setTimeout(func, delay[, lang]);

在Chrome和FF下定义被修改:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = window.setTimeout(code, delay);

IE:不支持第三个参数。
Chrome:接受的参数=传递的参数个数。
FF:接受的参数=传递的参数个数+1。firefox官方给出的解答是:

https://developer.mozilla.org/en/DOM/window.setTimeout
Note: Gecko passes an extra parameter to the callback routine, indicating the "lateness" of the timeout in milliseconds.

可以用一下方法解决IE下不支持的问题:

(function(w){
//ie传入第三个参数
if(!+[1,]){//除IE外,!+[1,]都是返回false
(function(overrideFn){
w.setTimeout = overrideFn(w.setTimeout);
w.setInterval = overrideFn(w.setInterval);
})(function(originalFn){
return function(code,delay){
var args = Array.prototype.slice.call(arguments,2);
return originalFn(function(){
if(typeof code == 'string'){
eval(code);
}else{
code.apply(this,args);
}
},delay);
}
})
}
})(window);