首页 > 代码库 > 重写setTimeout

重写setTimeout

 

重写setTimeout方法

新的方法为:setTimeout(function(){},delay,params)

第一个参数为回调函数,

第二个参数为延迟时间,

第三个参数为向回调函数传入的参数值。

 

方法一:使用高阶函数

function overrideSetTimeout(fn){
        return function(callback, delay, params){
            var args = Array.prototype.slice.call(arguments, 2);
            var _callback = function(){
                callback.apply(null, args);
            }
            fn(_callback,delay);
        }
}

setTimeout = overrideSetTimeout(setTimeout);
setTimeout(function(a, b){
          alert(a + ‘‘ + b)
},1000,‘a‘,‘b‘);

 弹出‘ab‘

分析:

(1)把原生的setTimeout作为参数赋值给参数fn

(2)利用闭包的特性,overrideSetTimeout方法内函数可调用fn,且fn不释放

(3)执行 overrideSetTimeout方法,返回一个新的函数,赋值给变量setTimeout,并且覆盖原生的setTimeout方法

(4)调用执行复写的setTimeout方法,实际上是调用了原生的setTimeout方法,只是在调用原生setTimeout方法前做了一些其他工作。

 

注意:

不能直接在overrideSetTimeout方法内直接使用原生的setTimeout,这样会无穷尽调用复写的setTimeout。

function overrideSetTimeout(){
  return function(callback, delay, params){
    setTimeout(callback.bind(null,params),delay);
  }
}
setTimeout = overrideSetTimeout();
setTimeout(function(params){
  alert(params)
},1000,‘a‘)

 

方法二:使用中间变量origin

var origin = setTimeout;
ar setTimeout = function(callback, delay, params){

    var args = Array.prototype.slice.call(arguments, 2);
    function _callback(){
        callback.apply(null, args);
    }
    origin(_callback,delay);
}

setTimeout(function(a,b){
    alert(a + ‘‘ +b);
},1000,‘a‘, ‘b‘);

弹出‘ab‘

重写setTimeout