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

  • 相关阅读:
    Transact_SQL小手册
    使用泛型的 TArray 从动态数组中查找指定元素
    使用泛型的 TArray 为动态数组排序
    使用 InputBox、InputQuery 的启发
    近况汇报
    泛型排序器 TComparer
    详测 Generics Collections TList (2): First、Last、IndexOf、LastIndexOf
    详测 Generics Collections TList (1): Add、Clear、Count、Capacity
    WindowsAPI: MulDiv
    SendTextMessage 等方便的消息发送函数
  • 原文地址:https://www.cnblogs.com/fe-huahai/p/6476117.html
Copyright © 2020-2023  润新知