في JavaScript ، إذا كانت الوظيفة تنتمي إلى كائن ، فإن سلوك الوصول إلى الوظيفة من خلال الكائن يسمى "Method Call". على عكس مكالمات الوظائف العادية ، عند إجراء استدعاء طريقة ، سيتغير هذا المرجع في الوظيفة - سيشير هذا إلى الكائن المستخدم لاستدعاء الوظيفة (سيصبح هذا الكائن سياق الاحتجاج لدعوة الطريقة):
نسخة الكود كما يلي:
var x = 99 ؛
عينة var = {
X: 1 ،
الفعل: وظيفة (أ) {
this.x = a*a ؛ // تعيين قيمة لـ sample x ، وليس الكائن العالمي x.
}
}
عينة.
console.log (sample.x) ؛ // 36
console.log (x) ؛ // 99
مثل الوصول إلى الخصائص في الكائنات ، بالإضافة إلى استخدام عوامل DOT ، يمكن لـ JavaScript أيضًا استخدام عوامل المشغلين لإجراء مكالمات الطريقة:
نسخة الكود كما يلي:
// طرق أخرى لاستدعاء الطريقة
عينة ["ACT"] (7) ؛
console.log (sample.x) ؛ // 49
بالنسبة للوظائف في JavaScript ، يتمثل سلوك مثير للاهتمام في تضمين وظائف (الإغلاق) في الوظائف. عند إجراء استدعاء طريقة ، إذا كانت هناك وظيفة مضمنة في وظيفة الطريقة ، يمكن للرمز في هذه الوظيفة المضمنة الوصول إلى القيمة المتغيرة الخارجية:
نسخة الكود كما يلي:
// يمكن للوظيفة المتداخلة الوصول إلى متغير خارجها.
var y = 88 ؛
var sample2 = {
Y: 1 ،
ACT2: وظيفة (أ) {
this.y = inner () ؛
وظيفة inner () {
إرجاع A*A ؛
}
}
}
sample2.act2 (8) ؛
console.log (sample2.y) ؛ // 64
console.log (y) ؛ // 88
ومع ذلك ، على عكس الحدس ، فإن الكود المضمن في الوظيفة لا يمكن أن يرث هذا من الخارج ؛ وهذا هو ، في الوظيفة المدمجة ، لا يشير هذا إلى الكائن الذي يدعو الطريقة ، ولكن إلى الكائن العالمي:
نسخة الكود كما يلي:
// وظيفة متداخلة لا ترث "هذا". "هذا" في الوظيفة المتداخلة هو كائن عالمي
var sample3 = {
ACT3: Function () {
داخلي()؛
وظيفة inner () {
console.log (هذا) ؛ // كائن نافذة
}
}
}
sample3.Act3 () ؛
إذا كنت بحاجة حقًا إلى الوصول إلى الكائن الذي يستدعي الطريقة في الوظيفة المدمجة ، فيمكنك حفظ هذه القيمة في متغير في الوظيفة الخارجية:
نسخة الكود كما يلي:
// تمرير "هذا" إلى وظيفة متداخلة
var sample4 = {
ACT4: Function () {
var self = this ؛
داخلي()؛
وظيفة inner () {
console.log (self) ؛ // object {act4 = function ()}
}
}
}
sample4.Act4 () ؛