話說阿裡巴巴今年的校園招聘有一道題目考了一個知識點,那就是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