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();