Dikatakan bahwa rekrutmen kampus Alibaba tahun ini memiliki pertanyaan yang menguji titik pengetahuan, yaitu penunjuk this pada fungsi parameter setInterval.
Ketika saya melihat pertanyaan ini, saya bingung karena saya tidak menyelesaikan masalahnya pada saat itu. Saya memikirkannya untuk waktu yang lama dan tidak dapat menemukannya cakupan fungsi setelah setInterval dan setTimeout bersifat global, artinya bagian dalam ini menunjuk ke objek global.
Masalah ini merepotkan. Saya sering menggunakan ini untuk merujuk ke objek saat ini dalam fungsi loop. Mungkin Anda berpikir untuk menggunakan penutupan, tetapi situasi sebenarnya tidak sesederhana itu. Ketika ada terlalu banyak contoh objek, penutupan menjadi berantakan.
Keinginan saya adalah menjadikan fungsi loop ini tetap menunjuk ke objek konteks saat ini, tanpa meneruskan parameter atau penutupan (sebenarnya, ini juga merupakan penutupan, tetapi bentuknya terlihat lebih alami);
Misalnya: (Sebagian kode digunakan untuk mengirim permintaan secara teratur)
1 var sendRequest=fungsi(){}
2 kirimRequest.prototipe={
3............................................
4 ........................
5 mulaiKirim:fungsi(){
6 //Buat fungsi loop ini menunjuk ke objek ini dan bukan ke objek global
7 this.loop_send=setInterval((fungsi(param){
8 mengembalikan fungsi(){param.sendARequest();}
9 })(ini),ini.pilihan.interval);
10},
11 sendARequest:fungsi(){
12 ini.num++;
13 ini.checkLimit();
14 var panggilan balik = {
15 kesuksesan: this.handleSuccess,
16 kegagalan: this.handleFail,
17 argumen: {
18 pegangan: ini,
19 batas waktu:500
20}
dua puluh satu }
22 var post_data="...."
23 //Jika data yang akan dikirim tidak kosong, sebagian data akan dikeluarkan dan dikirim ke latar belakang
24 if(this.data_wait_for_send.length!=0){
25 untuk(var i=0,j=ini.data_wait_for_send.length;i<j;i++){
26 post_data+="&content[]="+ini.data_wait_for_send[i];
27}
28 ini.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
-