في المرة الأولى التي ترجمت فيها مقالًا تقنيًا ، ضحكت عليك!
النص الأصلي المترجم:
function.apply و function.call في JavaScript
تم حذف الفقرة الأولى.
تحتوي كل وظيفة JavaScript على العديد من الطرق المرفقة ، بما في ذلك ToString () ، و Call () وتطبيق (). يبدو أنه ستجد أنه من الغريب أن يكون للوظيفة أساليبها الخاصة ، ولكن تذكر أن كل وظيفة في JavaScript هي كائن. ألقِ نظرة على هذه المقالة واستعرض ميزات JavaScript (Refresher). قد ترغب أيضًا في معرفة الفرق بين الوظائف والأساليب في JavaScript. أعتقد أن وصف "الوظائف" و "الأساليب" هو مجرد اتفاقية معتادة لجافا سكريبت. تعتمد الوظائف على نفسها (على سبيل المثال: التنبيه ()) ، والطرق هي سمات كائن داخل الوظيفة (القاموس) ، ونحن نسمي الطرق من خلال الكائنات. كل كائن JavaScript لديه طريقة tostring (). فيما يلي مثال على الكود. في كائن وظيفة ، يمكننا استخدام طريقة ToString ().
دالة foo () {Alert ('x') ؛} ALERT (foo.toString ()) ؛لأن الوظائف هي كائنات ، لديهم خصائصها وطرقها الخاصة. يمكننا التفكير فيها كبيانات. في هذه المقالة ، نركز فقط على أساليب وظيفتين تنطبق () و Call ().
لنبدأ بالرمز التالي:
var x = 10 ؛ function f () {Alert (this.x) ؛} f () ؛نحدد وظيفة عالمية f (). F () تصل إلى المتغير x من خلال هذه الكلمة الرئيسية ، ولكن تجدر الإشارة إلى أننا لا نستطيع استدعاء هذه الوظيفة من خلال مثيل لكائن. ما هو الكائن الذي تشير إليه؟ سيشير هذا إلى هذا الكائن العالمي. يتم تعريف المتغير X لدينا في هذا الكائن العالمي. يمكن تشغيل الرمز أعلاه بشكل طبيعي. ستعرض نتيجة التشغيل مربع حوار ، ويتم عرض 10 في مربع الحوار.
يمكننا الاتصال بالاتصال () وتطبيق () من خلال هذا. كما يوضح المثال التالي كيفية استخدام Call ():
var x = 10 ؛ var o = {x: 15} ؛ function f () {Alert (this.x) ؛} f () ؛ f.call (o) ؛أولاً ، ستعرض الاتصال F () مربع الحوار من 10 ، لأن هذه النقطة إلى الكائن العالمي في هذا الوقت. ثم ندعو طريقة Call () لوظيفة F ، والمعلمة التي تم تمريرها IS O ، وتظهر نتيجة التشغيل قيمة سمة X في O 15. ستستخدم طريقة Call () المعلمة الأولى كأشكالها إلى وظيفة F. وهذا هو ، سوف نخبر وقت التشغيل الذي يعرض هذا في وظيفة f يشير إلى.
تبدو هذه القفزة مضحكة بعض الشيء ، وحتى شذوذ لمبرمجي C ++ و Java و C#. هذه كلها أجزاء مثيرة للاهتمام من ecmascript.
يمكنك أيضًا نقل المعلمات إلى الوظيفة من خلال Call ():
var x = 10 ؛ var o = {x: 15} ؛ function f () {Alert (this.x) ؛} f () ؛ f.call (o) ؛تطبيق () و Call () متشابهان ، باستثناء أن تطبيق () يتطلب أن تكون المعلمة الثانية عبارة عن صفيف. سيتم تمرير هذه الصفيف كوسيطة إلى الوظيفة المستهدفة.
var x = 10 ؛ var o = {x: 15} ؛ function f (message) {Alert (message) ؛ ALERT (this.x) ؛} f ('invound f') ؛ f.apply (o ، ['invowing f ty application']) ؛طريقة تطبيق () مفيدة لأننا يمكننا إنشاء وظيفة دون الاهتمام بمعلمات الطريقة الهدف. يمكن أن تمر هذه الوظيفة معلمات إضافية إلى الطريقة من خلال معلمة الصفيف الثانية من تطبيق ().
var o = {x: 15} ؛ function f1 (message1) {alert (message1 + this.x) ؛} الدالة f2 (message1 ، message2) {Alert (message1 + (this.x * this.x) + message2) ؛ ["قيمة x squared = '،'.هناك شيء خاطئ في هذا الجملة. من أجل استدعاء طريقة تطبيق () ، نقوم بإجبار الوظيفة الهدف على استخدام المعلمات في الصفيف. لحسن الحظ ، هناك طريقة لجعل هذا الجملة أسهل. قبل ذلك ، يجب أولاً تقديم واحد: معرف المعلمة.
في JavaScript ، كل وظيفة لديها بالفعل قائمة معلمات طول متغير. هذا يعني أنه حتى إذا كان للدالة معلمة واحدة فقط ، فيمكننا تمرير 5 معلمات إليها. لن يكون للرمز التالي أي أخطاء ، وتظهر النتيجة "H".
الدالة f (message) {Alert (message) ؛} f ('h' ، 'e' ، 'l' ، 'l' ، 'o') ؛في F () ، إذا لم نرغب في قبول المعلمات الأخرى ، فيمكننا استخدام وسيطات الكلمات الرئيسية. تمثل الوسيطات كائن وسيطة ، له سمة تمثل طولًا مشابهاً لمجموعة.
الوظيفة f (message) {// قيمة الرسالة هي نفس الوسيطات [0] لـ (var i = 1 ؛ i <enduces.length ؛ i ++) {message+= ediuments [i] ؛ } ALERT (message) ؛} // تعرض النتيجة "Hello" F ('H' ، 'E' ، 'l' ، 'l' ، 'o') ؛يجب أن تعلم أنه بالمعنى الدقيق للكلمة ، فإن الحجج ليست صفيفًا. الوسيطات لها سمة طول ، ولكن لا توجد أساليب تقسيم ودفع وبوب. في وظيفة G () السابقة ، يمكننا نسخ المعلمات المطلوبة من الوسيطات ، وتشكيل صفيف ، ثم تمرير هذا الصفيف لتطبيق ().
var o = {x: 15} ؛ function f (message1 ، message2) {alert (message1 + (this.x * this.x) + message2) ؛} function g (object ، func) {// mationals [0] = object // mancepitions [1] = func var args = [] ؛ لـ (var i = 2 ؛ i <enduces.length ؛ i ++) {args.push (الوسيطات [i]) ؛ } func.apply (كائن ، args) ؛} g (o ، f ، 'قيمة x squared =' ، '. wow!') ؛عندما ندعو G () ، يمكننا تمرير وسيط إضافية كمعلمات بدلاً من حشو الوسيطات في صفيف.