올해 알리바바의 캠퍼스 모집에는 지식 포인트를 테스트하는 문제가 있다고 하는데, 그것이 setInterval의 매개변수 함수에 있는 this 포인터입니다.
이 질문을 보고 당시에 문제가 해결되지 않아 혼란스러웠습니다. setInterval 및 setTimeout 이후의 함수 범위는 전역입니다. 즉, 이 내부는 전역 객체를 가리킵니다.
이 문제는 귀찮습니다. 루프 함수에서 현재 개체를 참조하기 위해 자주 사용합니다. 클로저를 사용한다고 생각할 수도 있지만 실제 상황은 개체 인스턴스가 너무 많으면 복잡해집니다.
내 희망은 루프 함수에서 매개변수나 클로저를 전달하지 않고 여전히 현재 컨텍스트의 객체를 가리키도록 하는 것입니다(사실 이것도 클로저이지만 형태가 더 자연스러워 보입니다).
예: (코드의 일부는 정기적으로 요청을 보내는 데 사용됩니다.)
1 var sendRequest=function(){}
2 sendRequest.prototype={
3...........................................
4 ..........................
5 시작보내기:함수(){
6 //루프 함수에서 전역 개체 대신 이 개체를 가리키도록 만듭니다.
7 this.loop_send=setInterval((함수(param){
8 반환 함수(){param.sendARequest();}
9 })(this),this.options.interval);
10},
11 sendARequest:함수(){
12 this.num++;
13 this.checkLimit();
14 var 콜백 = {
15 성공: this.handleSuccess,
16 실패: this.handleFail,
인수 17개: {
18 손잡이: 이,
19 타임아웃:500
20}
스물 하나 }
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 //디버그(포스트_데이터)
31 var que = Connect.asyncRequest('POST', this.options.getUrl, callback,post_data);
32},
33............................
34...........................
35}
36
-