重写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'