يقال إن التوظيف في الحرم الجامعي على بابا هذا العام لديه سؤال يختبر نقطة المعرفة، وهو هذا المؤشر في وظيفة المعلمة لـ 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),this.options.interval);
10}،
11 إرسالطلب:وظيفة(){
12 this.num++;
13 this.checkLimit();
14 فار رد الاتصال = {
15 النجاح: هذا. التعامل مع النجاح،
16 فشل: this.handleFail،
17 وسيطة: {
18 مقبض: هذا،
19 مهلة: 500
20}
واحد وعشرون }
22 فار post_data = "..."
23 //إذا لم تكن البيانات المراد إرسالها فارغة، فسيتم إخراج جزء من البيانات وإرسالها إلى الخلفية
24 إذا(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
-