zoukankan      html  css  js  c++  java
  • 重写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'

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/fe-huahai/p/6476117.html
Copyright © 2011-2022 走看看