يمكن لكل وظيفة JavaScript الوصول إلى متغير خاص - وسيطات ضمن نطاقها. يحتوي هذا المتغير على قائمة بجميع المعلمات التي تم تمريرها إلى الوظيفة.
كائن الوسائط ليس صفيفًا. على الرغم من أنه يمتلك نفس المكان مثل الصفيف ، على سبيل المثال ، يحتوي على خاصية الطول. لكنه لم يتم موروثه من Array.prototype ، في الواقع ، إنه كائن.
لذلك ، لا يمكننا استخدام بعض أساليب الصفيف مباشرة للوسائط ، مثل الدفع أو البوب أو الشريحة ، وما إلى ذلك من أجل استخدام هذه الأساليب ، نحتاج إلى تحويلها إلى صفيف حقيقي.
تحويل إلى صفيف
سيعيد الرمز التالي صفيفًا يحتوي على جميع عناصر كائن الوسائط.
Array.Prototype.slice.call (الحجج) ؛
لأن سرعة التحويل بطيئة للغاية ، لا ينصح بذلك في البرامج ذات متطلبات الأداء الصارمة.
تمرير المعلمات
فيما يلي طريقة أكثر موصى بها لتمرير كائن الوسائط من وظيفة إلى أخرى.
نسخة الكود كما يلي:
وظيفة foo () {
bar.apply (NULL ، الحجج) ؛
}
شريط الوظائف (A ، B ، C) {
// افعل الأشياء هنا
}
هناك طريقة ذكية أخرى ، والتي تتمثل في إنشاء طريقة خارجية غير مرغوب فيها باستخدام المكالمة والتطبيق في نفس الوقت.
نسخة الكود كما يلي:
وظيفة foo () {}
foo.prototype.method = function (a ، b ، c) {
console.log (هذا ، a ، b ، c) ؛
} ؛
// قم بإنشاء نسخة غير محدودة من "الطريقة"
// يستغرق المعلمات: هذا ، arg1 ، arg2 ... argn
foo.method = function () {
// النتيجة: foo.prototype.method.call (هذا ، Arg1 ، Arg2 ... Argn)
function.call.apply (foo.prototype.method ، الحجج) ؛
} ؛
العلاقة بين معلمات الوظيفة وسمات الوسائط
يقوم كائن الوسائط بإنشاء طرق Getter و Setter لكل من خصائصه ومعلمات الوظائف.
لذلك ، سيؤثر تعديل المعلمات الرسمية للدالة على قيم خاصية كائن الوسائط المقابلة والعكس صحيح.
نسخة الكود كما يلي:
وظيفة foo (a ، b ، c) {
الحجج [0] = 2 ؛
أ ؛ // 2
ب = 4 ؛
الحجج [1] ؛ // 4
var d = c ؛
د = 9 ؛
ج. // 3
}
فو (1 ، 2 ، 3) ؛
قضايا الأداء
لن يتم إنشاء الوسائط في حالتين فقط ، يتم الإعلان عن إحداها كمتغير محلي داخل الوظيفة ، ويتم استخدام الآخر كمعلمة رسمية للوظيفة. في حالات أخرى ، سيتم دائمًا إنشاء كائن الوسائط.
نظرًا لأن أساليب Getter و Setter يتم إنشاءها دائمًا مع إنشاء كائنات الوسائط ، فإن استخدام الوسائط ليس له تأثير يذكر على الأداء نفسه.
ومع ذلك ، هناك موقف يؤثر بشكل خطير على أداء JavaScript ، وهو استخدام الحجج.
نسخة الكود كما يلي:
وظيفة foo () {
الحجج. callee ؛ // افعل شيئًا باستخدام هذا الكائن الوظيفة
الحجج. callee.caller ؛ // وكائن دالة الاتصال
}
وظيفة bigloop () {
لـ (var i = 0 ؛ i <100000 ؛ i ++) {
foo () ؛ // عادة ما يتم ضمها ...
}
}
في الكود أعلاه ، لم تعد وظيفة FOO امتدادًا بسيطًا ، لأنه يحتاج إلى معرفة نفسه ومتصله. هذا لا يعرض فقط تحسينات الأداء التي جلبتها الامتدادات المضمنة ، ولكن أيضًا يقوض تغليف الوظيفة ، لأن الوظيفة نفسها قد تحتاج إلى الاعتماد على خلفية استدعاء محددة.
لذلك ، يوصى بعدم استخدام الوسائط.
ما سبق هو كل شيء عن كائن وسيطات JavaScript. هل تعرف ذلك بدقة؟ ببساطة
تشير الوسائط إلى كائن المعلمة للدالة (تشير إلى المعلمات الفعلية التي تم تمريرها)
يشير الطول. الطول إلى طول كائن المعلمة للدالة.
الوسيطات [i] تشير إلى قيمة المعلمة I-th (الأول هو 0)