让setInteval里的函数参数中的this指向特定的对象
2010-02-01 10:46:34 来源:WEB开发网核心提示:话说阿里巴巴今年的校园招聘有一道题目考了一个知识点,那就是setInterval的参数函数里的this指向. 看到这个题,我蒙了,因为那时候我不清除这个问题,想了半天没想出来,后来到网上一查,在国外的某网站查到说setInterval和setTimeout之后的函数的作用域是全局的,也就是里面的this指向的是全局对象
话说阿里巴巴今年的校园招聘有一道题目考了一个知识点,那就是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
看到这个题,我蒙了,因为那时候我不清除这个问题,想了半天没想出来,后来到网上一查,在国外的某网站查到说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
Tags:setInteval 函数 参数
编辑录入:爽爽 [复制链接] [打 印]赞助商链接