仅IE不支持setTimeout/setInterval函数的第三个以上参数

复制代码 代码如下:

  setTimeout(function(obj){

  alert(obj.a);

  }, 2000, {a:1});

  即传了第三个参数,第三个参数将作为回调函数的参数obj传入。在非IE浏览器中都弹出了1。这样有个好处,即解决了回调函数的执行上下文,比如要调用某个对象的某个方法,即可以通过参数把该对象传进去。

  

复制代码 代码如下:

  setTimeout(function(obj){

  obj.method();

  }, 2000, obj);

  当然,你还可以传多个参数给回调函数,如下

  

复制代码 代码如下:

  setTimeout(function(a, b){

  alert(a);

  alert(b);

  }, 2000, 1,2);

  这次我们传了两个参数1,2给回调函数,Firefox/Safari/Chrome/Opera中依次弹出了1,2。只要你愿意还可以传更多。

  虽然除了IE不支持第三个参数外,但Firefox和Safari/Chrome/Opera之间还是有区别的

  

复制代码 代码如下:

  setTimeout(function(){

  alert(arguments.length);

  }, 2000, 1,2);

  传了两个参数1,2给回调函数,然后alert出实参的长度

  Firefox : 3

  Safari/Chrome/Opera : 2

  奇怪吧,明明传的是两个参数,但Firefox中弹出的却是3。如果输出第三个参数会发现它是一个数字,有时还是负数。

  关:

  http://www.w3.org/TR/Window/

  https://developer.mozilla.org/en/DOM/window.setTimeout

  http://msdn.microsoft.com/en-us/library/ms536753%28v=vs.85%29.aspx 

  //解决IE下setTimeout传参数的bug

  

复制代码 代码如下:

  //解决IE下setTimeout传参数的bug

  if(!+[1,]) {

  (function(overrideFun){

  window.setTimeout = overrideFun(window.setTimeout);

  window.setInterval = overrideFun(window.setInterval);

  })(

  function(originalFun){

  return function(code, delay){

  var args = [].slice.call(arguments, 2);

  return originalFun(

  function(){

  if (typeof code == 'string') {

  eval(code);

  }

  else {

  code.apply(this, args);

  }

  },

  delay

  )

  }

  }

  );

  }