7.0 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	title, localeTitle
| title | localeTitle | 
|---|---|
| this reference | هذا المرجع | 
this المرجع
في JavaScript ، تحتوي كل وظيفة على this المرجع الذي تم إنشاؤه تلقائيًا عندما تعلنه. يشبه this المرجع تمامًا this المرجع في اللغات الأخرى القائمة على الفصل مثل Java أو C # (جافا سكريبت هي لغة مبنية على النموذج وليس مفهوم "class"): يشير إلى الكائن الذي يستدعي الوظيفة (هذا الكائن أحيانًا يسمى السياق ). في JavaScript ، ومع ذلك ، يمكن ربط this المرجع داخل الوظائف بكائنات مختلفة اعتمادًا على مكان استدعاء الدالة . فيما يلي 5 قواعد أساسية this الربط في JavaScript:
المادة 1
عندما يتم استدعاء دالة في النطاق العمومي ، يكون this المرجع بشكل افتراضي مرتبطًا بالعنصر العام ( window في المستعرض ، أو global في Node.js). فمثلا:
`function foo() { this.a = 2; }
foo(); console.log(a); // 2 `
ملاحظة: إذا قمت بالإعلان عن الدالة foo() أعلاه في الوضع المقيد ، فإنك تقوم باستدعاء هذه الوظيفة في النطاق العالمي ، فسيكون this undefined this.a = 2 التعيين هذا. this.a = 2 إلى this.a = 2 استثناء Uncaught TypeError .
القاعدة 2
دعونا نفحص المثال أدناه:
`function foo() { this.a = 2; }
var obj = { foo: foo };
obj.foo(); console.log(obj.a); // 2 `
بوضوح ، في المقتطف أعلاه ، يتم استدعاء الدالة foo() مع السياق هو كائن obj this الإشارة مرتبطة الآن بـ obj . لذلك عندما يتم استدعاء دالة مع كائن سياق ، سيكون this المرجع مرتبطًا بهذا الكائن.
القاعدة 3
.call ، .apply و .bind يمكن لجميع استخدامها في موقع الدعوة إلى ربط صراحة this . باستخدام .bind(this) هو شيء قد تراه في الكثير من مكونات React.
`var foo = function() { console.log(this.bar) }
foo.call({ bar: 1 }) // 1 `
في ما يلي مثال سريع عن كيفية استخدام كل منها لربط this :
- fn.call(thisObj, fnParam1, fnParam2)- .call():- fn.call(thisObj, fnParam1, fnParam2)
- .apply():- fn.apply(thisObj, [fnParam1, fnParam2])
- .bind():- const newFn = fn.bind(thisObj, fnParam1, fnParam2)
القاعدة 4
`function Point2D(x, y) { this.x = x; this.y = y; }
var p1 = new Point2D(1, 2); console.log(p1.x); // 1 console.log(p1.y); // 2 `
الشيء الذي يجب أن تلاحظه هو الدالة Point2D التي يتم Point2D رئيسية new ، this المرجع مرتبط بـ كائن p1 . لذلك عندما يتم استدعاء دالة بكلمة رئيسية new ، فإنها ستنشئ كائنًا جديدًا وستكون this الإشارة مرتبطة بهذا الكائن.
ملاحظة: عند استدعاء وظيفة بكلمة رئيسية new ، فإننا نسميها أيضًا كوظيفة مُنشئ .
القاعدة 5
تحدد جافا سكريبت قيمة this في وقت التشغيل ، بناءً على السياق الحالي. لذلك قد يشير this بعض الأحيان إلى شيء آخر غير ما تتوقعه.
خذ بعين الاعتبار هذا المثال لفئة Cat باستخدام طريقة تسمى makeSound() ، متبعاً النمط في القاعدة 4 (أعلاه) مع دالة منشئ وكلمة رئيسية new .
var Cat = function(name, sound) {  this.name = name;  this.sound = sound;  this.makeSound = function() {  console.log( this.name + ' says: ' + this.sound );  };  }  var kitty = new Cat('Fat Daddy', 'Mrrooowww');  kitty.makeSound(); // Fat Daddy says: Mrrooowww  
الآن دعونا نحاول إعطاء القطة وسيلة annoy() الناس عن طريق تكرار صوته 100 مرة ، مرة واحدة كل نصف ثانية.
var Cat = function(name, sound) {  this.name = name;  this.sound = sound;  this.makeSound = function() {  console.log( this.name + ' says: ' + this.sound );  };  this.annoy = function() {  var count = 0, max = 100;  var t = setInterval(function() {  this.makeSound(); // <-- this line fails with `this.makeSound is not a function`  count++;  if (count === max) {  clearTimeout(t);  }  }, 500);  };  }  var kitty = new Cat('Fat Daddy', 'Mrrooowww');  kitty.annoy();  
لا يعمل ذلك لأننا قمنا بإنشاء سياق جديد بنطاق عالمي داخل الاستدعاء setInterval ، لذا لم يعد this يشير إلى مثيلتنا. في مستعرض ويب ، makeSound() this بدلاً من ذلك إلى كائن الإطار ، الذي لا يحتوي على أسلوب makeSound() .
طريقتان لجعلها تعمل:
- قبل إنشاء إطار جديد، تعيين thisإلى متغير محلي يدعىme، أوself، أو ما تريد أن نسميها، واستخدام هذا المتغير داخل الاستدعاء.
var Cat = function(name, sound) {  this.name = name;  this.sound = sound;  this.makeSound = function() {  console.log( this.name + ' says: ' + this.sound );  };  this.annoy = function() {  var count = 0, max = 100;  var self = this;  var t = setInterval(function() {  self.makeSound();  count++;  if (count === max) {  clearTimeout(t);  }  }, 500);  };  }  var kitty = new Cat('Fat Daddy', 'Mrrooowww');  kitty.annoy();  
- باستخدام ES6 ، يمكنك تجنب تعيين thisللمتغير المحلي باستخدام وظيفة السهم ، والتي تربطthisبسياق الرمز المحيط حيث تم تعريفه.
var Cat = function(name, sound) {  this.name = name;  this.sound = sound;  this.makeSound = function() {  console.log( this.name + ' says: ' + this.sound );  };  this.annoy = function() {  var count = 0, max = 100;  var t = setInterval(() => {  this.makeSound();  count++;  if (count === max) {  clearTimeout(t);  }  }, 500);  };  }  var kitty = new Cat('Fat Daddy', 'Mrrooowww');  kitty.annoy();