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'

  • 相关阅读:
    springBoot 2.1.5 pom 文件 unknown 错误
    @HystrixCommand 不能被导包
    SQL数据库连接语句
    ADO.NET中COMMAND对象的ExecuteNonQuery、ExcuteReader和ExecuteScalar方法
    重载和重写的区别
    抽象类和接口的相同点和不同点
    结构详解
    简单工厂和抽象工厂的区别
    DataRead和DataSet的异同
    什么是Web Server
  • 原文地址:https://www.cnblogs.com/fe-huahai/p/6476117.html
Copyright © 2011-2022 走看看