(function(f){
 window.setTimeout =f(window.setTimeout);
 window.setInterval =f(window.setInterval);
})(function(f){return function(c,t){var a=[].slice.call(arguments,2);return f(function(){c.apply(this,a)},t)}});
另外请问下:window.setTimeout(function(){
    alert(arguments.length);//为什么Firefox下为是4,最后一个参数不知道是什么??
},1,"a","b","s");

解决方案 »

  1.   


    <script type="text/javascript">
    (function(f){
      window.setTimeout =f(window.setTimeout);
      window.setInterval =f(window.setInterval);
    })(function(f){
    return function(c,t){
    var a=[].slice.call(arguments,2);
    return f(function(){
    c.apply(this,a)
    },t)
    }
    });
    </script>
      

  2.   


    <script type="text/javascript">
    window.setTimeout(function(){
            for(var i = 0; i < arguments.length; i++){
    alert(arguments[i]);
    }//为什么Firefox下为是4,最后一个参数不知道是什么??
        },1,"a","b","s");
    </script>
    最后一个是37~·不清楚是什么
      

  3.   

    最后一个数好像是执行时间~·每次都不一样~·是setTimeout的执行时间~`毫秒数~·
      

  4.   


    <script type="text/javascript">
        (function(f){
             window.setTimeout =f(window.setTimeout);
             window.setInterval =f(window.setInterval);
        })(function(f){
            return function(c,t){
                var a=[].slice.call(arguments,2);
                return f(function(){
                    c.apply(this,a)
                },t)
            }
        });
    </script>
    最外层是一个闭包
    (function(f//这个f就是形参){
       //这里是函数的主体
       window.setTimeout =f(window.setTimeout);//主句话就好比这样
       window.setTimeout = function(window.setTimeout){
          return function(c,t){ 
                var a=[].slice.call(arguments,2); //把c,t组成数组
                return f(function(){ //这是返回一个闭包,但是没有执行
                    c.apply(this,a) //c就好比是咱们的a()函数方法,apply是自掉方法.把数组a传进去
                },t//是执行时间)
           }
       }
    })(function(f){ //最外层是一个匿名函数,当实参传给函数,就是那个形参f
            return function(c,t){ 
                var a=[].slice.call(arguments,2);
                return f(function(){
                    c.apply(this,a)
                },t)
            }
        })
    当最外面调用window.setTimeout时,传给它一个c,一个t
    c就好比是函数方法~·如
    function a(){
       alert('你好');
    }
    window.setTimeout(a//把方法a传进去,t//就是时间)()//返回闭包,加上()执行;
      

  5.   

    多谢了,看懂这个真累,
    为什么运行这个之后alert(window.setTimeout);和alert(setTimeout);不一样了呢?setTimeout不是window下面的一个函数吗?为什么加上window.setTimeout=function(){}无法将其覆盖?
      

  6.   


    因为你运行完作用域链上就有window.setTimeout了~·这样访问setTimeout是访问window的~·可作用域链会先找到~·你执行后的window.setTimeout~`为什么加上window.setTimeout=function(){}无法将其覆盖?如果你想覆盖就得用原型~·prototype
    window.prototype.setTimeout = function(){};这样写才能覆盖~··
      

  7.   

    兄弟,我也知道要用prototype,可是window.prototype为空啊
      

  8.   

    window对象没有prototype……那啥,window是浏览器的说……