让setInteval里的函数参数中的this指向特定的对象

王朝学院·作者佚名  2010-02-02
窄屏简体版  字體: |||超大  

话说阿里巴巴今年的校园招聘有一道题目考了一个知识点,那就是setInterval的参数函数里的this指向.

看到这个题,我蒙了,因为那时候我不清除这个问题,想了半天没想出来,后来到网上一查,在国外的某网站查到说setInterval和setTimeout之后的函数的作用域是全局的,也就是里面的this指向的是全局对象.

这个问题可麻烦了,我经常要在循环函数里用this来引用当前对象,也许你想到可以用闭包,不过实际情况并非如此简单,对象实例多了之后,闭包也乱套了.

我的愿望就是让循环函数里的this仍然指向当前上下文的对象,无需传参数,无需闭包(其实这也是闭包,只是形式上看着比较自然而已);

例如:(一部分代码,作用是定时发送请求)

1 var sendRequest=function(){}

2 sendRequest.prototype={

3 .............................

4 .............................

5 beginSend:function(){

6 //使循环函数里的this指向本对象,而不是全局对象

7 this.loop_send=setInterval((function(param){

8 return function(){param.sendARequest();}

9 })(this),this.options.interval);

10 },

11 sendARequest:function(){

12 this.num++;

13 this.checkLimit();

14 var callback = {

15 success: this.handleSuccess,

16 failure: this.handleFail,

17 argument: {

18 handle: this,

19 timeout:500

20 }

21 }

22 var post_data="...."

23 //如果待发送的数据不为空,则将取出一条数据发到后台

24 if(this.data_wait_for_send.length!=0){

25 for(var i=0,j=this.data_wait_for_send.length;i<j;i++){

26 post_data+="&content[]="+this.data_wait_for_send[i];

27 }

28 this.data_wait_for_send=[]

29 }

30 // debug(post_data)

31 var que = Connect.asyncRequest('POST', this.options.getUrl, callback,post_data);

32 },

33 ......................

34 ......................

35 }

36

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航