js中settimeout第三个参数验证


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,不确定数字,每次都会变。

JavaScript

我不是毛毛 12 years, 5 months ago

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);

狂热粉真可怕 answered 12 years, 5 months ago

Your Answer