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

时间: 2024-12-24 05:07:22

重写setTimeout的相关文章

重写setTimeout扩展参数

1 //判断函数行参长度来决定是否需要重写setTimeout,ie8以下为undefined 2 if(window.setTimeout.length == undefined){ 3 var __sto = window.setTimeout; 4 window.setTimeout = function(callback,timeout,param){ 5 var args = Array.prototype.slice.call(arguments,2); 6 __sto(functi

setTimeout 传参

http://blog.useasp.net/archive/2012/11/03/the-problem-when-setTimeout-invoke-a-function-with-an-object-parameter.aspx javascript中setTimeout调用function时,传递参数的问题 在javascript中调用setTimeout的时候,如果我们是无参数的方法,调用相对简单,直接像下面这样调用就可以了 code 1 2 3 4 5 6 7 8 9 10 11 1

XSS终结者:Content Security Policy(CSP)

Content Security Policy(CSP)简介 传统的web安全应该主要是同源策略(same origin policy).A网站的代码不能访问B网站的数据,每个域都和其他的域相互隔离,给开发者营造了一个安全沙箱.理论上这是非常聪明的做法,但是实际执行过程中,攻击者使用了各种高招可以推翻这套保护. XSS攻击者把恶意代码注入在网站常规数据里,这样就可以绕过浏览器的同源策略.浏览器相信来自安全域的所有代码.XSS Cheat Sheet是一个古老但是却很有代表性的攻击方式.一旦攻击者

Content Security Policy(CSP)简介(转)

Content Security Policy(CSP)简介 传统的web安全应该主要是同源策略(same origin policy).A网站的代码不能访问B网站的数据,每个域都和其他的域相互隔离,给开发者营造了一个安全沙箱.理论上这是非常聪明的做法,但是实际执行过程中,攻击者使用了各种高招可以推翻这套保护. XSS攻击者把恶意代码注入在网站常规数据里,这样就可以绕过浏览器的同源策略.浏览器相信来自安全域的所有代码. XSS Cheat Sheet 是一个古老但是却很有代表性的攻击方式.一旦攻

cookie session URL重写 与考试

状态管理.Cookie.Session.URL重写 HTTP协议:无状态的连接(每次连接都是新的请求)1.隐藏字段 <input type="hidden" name="session" value=""/> 在响应中进行操作2.Cookie 保存到客户端3.Session 保存到服务器4.用户禁用Cookie:使用URL重写 在URL后加上jsessionid=123; Cookie原理1.数据以"键-值"对的形

商务通默认弹窗重写代码

商务通默认弹窗重写代码,重写商务通默认的弹窗.实现原理:通过设置定时器,判断是否存在默认的商务通弹窗标签,如果存在则用自定义的代码将其覆盖. 以下为详细代码,其中o.innerHTML为自定义的弹窗代码,可自行修改为自己的代码: 代码如下 <script> function update_swt_wee() { var o = document.getElementById("LRfloater1"); if (o) { if (o.innerHTML.indexOf(&q

重写2048游戏

在慕客网上看到一个叫2048的游戏,作者讲的不错.听听很激动,看着很多网友留言,遇到各种问题,于是打算自己写一遍.试玩了一遍别人写好的2048.感觉逻辑还算容易理解.一种写下来,还是遇到了不少问题,但是冷静的想想,很快就找出问题,并解决了.最后,终于完成了自己的2048私人定制版. 下面是最终成果: 写完之后,其实代码一点都不难,会用jquery就可以了. 下面我自己的代码贴一下: index.html <!DOCTYPE html> <html> <head> <

setTimeout改变this指向

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> var name = "李四"; function Coder(name) { this.name = name; function alerts() { aler

使用setTimeout模拟setInterval效果

由于现在部分浏览器基于对系统性能的优化,在使用setInterval的时候,在页面没有获得关注的状态,浏览器可以会自动将setInterval终端,等到该页面重新获得关注时再开启.这样就会使得一些基于setInterval的定时效果出现意想不到的问题: 解决的办法就是使用setTimeout来模拟setInterval的效果. 具体实现过程如下: var i = 0;function time(){ //每隔1秒让++i console.log(++i); setTimeout(time,100