Говорят, что в этом году при наборе персонала в кампусе Alibaba есть вопрос, который проверяет точку знаний, и это указатель this в функции параметра setInterval.
Когда я увидел этот вопрос, я был в замешательстве, потому что на тот момент я не прояснил проблему. Я долго думал об этом и не мог понять. Затем я проверил в Интернете и нашел на зарубежном сайте, что. область действия функций после setInterval и setTimeout является глобальной, то есть это внутреннее указывает на глобальный объект.
Эта проблема вызывает затруднения. Я часто использую ее для ссылки на текущий объект в функции цикла. Возможно, вы думаете об использовании замыканий, но реальная ситуация не так проста. Когда экземпляров объекта слишком много, замыкания становятся беспорядочными.
Мое желание — сделать так, чтобы это в функции цикла по-прежнему указывало на объект текущего контекста, без передачи параметров или замыкания (по сути, это тоже замыкание, но по форме оно выглядит более естественно);
Например: (Часть кода используется для регулярной отправки запросов)
1 вар sendRequest=function(){}
2 sendRequest.prototype={
3.........................................
4 ............................
5 начатьОтправить:функция(){
6 //Сделайте это в функции цикла указателем на этот объект вместо глобального объекта
7 this.loop_send=setInterval((function(param){
8 функция возврата(){param.sendARequest();}
9 })(это),this.options.interval);
10},
11 sendARequest:функция(){
12 это.номер++;
13 this.checkLimit();
14 вар обратный вызов = {
15 успехов: this.handleSuccess,
16 ошибка: this.handleFail,
17 аргумент: {
18 ручка: это,
19 таймаут:500
20}
двадцать один }
22 вар 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 //отладка(post_data)
31 var que = Connect.asyncRequest('POST', this.options.getUrl, callback,post_data);
32},
33.............................
34.............................
35}
36
-