ว่ากันว่าการรับสมัครวิทยาเขตของอาลีบาบาในปีนี้มีคำถามที่ทดสอบจุดความรู้ และนั่นคือตัวชี้นี้ในฟังก์ชันพารามิเตอร์ของ setInterval
เมื่อฉันเห็นคำถามนี้ฉันก็สับสนเพราะตอนนั้นฉันไม่ได้เคลียร์ปัญหา ฉันคิดอยู่นานและคิดไม่ออก จากนั้นฉันก็ตรวจสอบออนไลน์และพบว่าในเว็บต่างประเทศ ขอบเขตของฟังก์ชันหลังจาก setInterval และ setTimeout เป็น global นั่นคือภายในชี้ไปที่อ็อบเจ็กต์โกลบอล
ปัญหานี้เป็นปัญหา ฉันมักจะใช้สิ่งนี้เพื่ออ้างถึงวัตถุปัจจุบันในฟังก์ชันลูป แต่สถานการณ์จริงไม่ง่ายนัก เมื่อมีอินสแตนซ์ของวัตถุมากเกินไป
ความปรารถนาของฉันคือการทำให้ฟังก์ชันวนซ้ำนี้ยังคงชี้ไปที่วัตถุของบริบทปัจจุบัน โดยไม่ต้องผ่านพารามิเตอร์หรือการปิด (อันที่จริงนี่คือการปิดด้วย แต่ดูเป็นธรรมชาติมากกว่าในรูปแบบ)
ตัวอย่างเช่น: (ส่วนหนึ่งของโค้ดใช้เพื่อส่งคำขอเป็นประจำ)
1 คือ sendRequest=function(){}
2 sendRequest.ต้นแบบ={
3................................................
4 ..............................
5 startSend:ฟังก์ชั่น(){
6 //ทำให้สิ่งนี้ในฟังก์ชันวนซ้ำชี้ไปที่วัตถุนี้แทนที่จะเป็นวัตถุส่วนกลาง
7 this.loop_send=setInterval((ฟังก์ชั่น(พารามิเตอร์){
8 ฟังก์ชันส่งคืน(){param.sendARequest();}
9 })(นี่),this.options.ช่วง);
10},
11 sendARequest:ฟังก์ชั่น(){
12 นี้.num++;
13 นี้.checkLimit();
โทรกลับ 14 ครั้ง = {
15 ความสำเร็จ: this.handleSuccess,
16 ความล้มเหลว: this.handleFail,
17 อาร์กิวเมนต์: {
18 หมายเลขอ้างอิง: นี่,
19 หมดเวลา: 500
20}
ยี่สิบเอ็ด }
22 var post_data="...."
23 //หากข้อมูลที่จะส่งไม่ว่างเปล่า ข้อมูลบางส่วนจะถูกนำออกและส่งไปยังพื้นหลัง
24 ถ้า(this.data_wait_for_send.length!=0){
25 สำหรับ(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, โทรกลับ, post_data);
32},
33............................
34............................
35}
36
-