كيفية كتابة وظيفة JS أن يقبل و "إلى الأمام" متغير عدد من المعلمات ؟
-
06-07-2019 - |
سؤال
كيف يمكنني كتابة وظيفة جافا سكريبت التي تقبل متغير عدد من المعلمات ، وإلى الأمام كل تلك المعايير الأخرى مجهول الوظائف ؟
على سبيل المثال في السيناريو من طريقة الحرائق الحدث:
function fireStartedEvent(a,b,c,d,e,f,g,...) {
for(var i = 0; i < startedListeners.length; i++) {
startedListeners[i](a,b,c,d,e,f,g,...);
}
}
خصوصا أن لدي مصنع الحدث الذي يولد هذه النار وسائل لدي رغبة في معرفة كيفية العديد من المعلمات حدث معين أو معالجات تستهلك.لذا يكون من الصعب السلكية في 7 الآن (من أ إلى ز).إذا كان أي أقل, لا مشكلة.إن كان هناك أي أكثر من ذلك ، فإنها تقطع.كيف يمكنني التقاط تمر على كل المعلمات ؟
شكرا
(باستخدام مسج أو أي جافا سكريبت الإطار ليس خيارا هنا.)
المحلول
حل هذا يتطلب المعرفة من اثنين جافا سكريبت المفاهيم.
الأول هو خاص arguments
المتغير المحلي التي يمكن استخدامها للوصول إلى وظيفة الحجج دون معرفة أسمائهم و يعمل مثل صفيف.ومع ذلك ، arguments
هو لا وهو Array
, ولكن هو "مجموعة مثل" - وجود خصائص اسمه 0..n-1
, حيث n
هو عدد من الحجج الدالة ، length
الملكية-الكائن.مظاهرة بسيطة الاستخدام قد يكون:
function f (a) { // can include names still, if desired
// arguments instanceof Array -> false (exceptions to this?)
var firstArg = arguments[0]
// a === firstArg -> always true
// iterate all arguments, just as if it were an Array:
for (var i = 0; i < arguments.length; i++) {
alert(i + " : " + arguments[i])
}
}
f("a","b","c")
الميزة الثانية هي Function.apply
والتي سيتم استدعاء وظيفة مع سياق محدد (this
عندما يتم استدعاء) مع الحجج التي تنجم عن التوسع من "مجموعة مثل" كائن. ولكن انظر 1.
وبالتالي وضعه معا:
function fireStartedEvent() {
for(var i = 0; i < startedListeners.length; i++) {
// jQuery will often pass in "cute" things, such as a element clicked
// as the context. here we just pass through the current context, `this`,
// as well as the arguments we received.
var arg = Array.prototype.slice.call(arguments)
startedListeners[i].apply(this, args)
}
}
1 في حين أن مواصفات ECMAScript فقط تدعو إلى "مجموعة مثل" كائن ، Function.apply
لا عالميا العمل مع "مجموعة مثل" كائن من تطبيقات تتطلب سليم Array
الكائن.التحذير من Function.apply
الرابط:
ملاحظة: معظم المتصفحات بما في ذلك كروم 14 و Internet Explorer 9, لا يزال لا تقبل مجموعة مثل الكائنات و سوف رمي استثناء [إذا كان غير كائن مجموعة يتم تمرير]. [فايرفوكس تم إصلاحها في الإصدار 4.]
الحمد لله, هناك نسبيا ببساطة لغة لتحويل "مجموعة مثل" كائن إلى Array
(وهو أمر مثير للسخرية لأن Array.slice
لا عالميا العمل مع "مجموعة مثل" الكائن):
var args = Array.prototype.slice.call(arguments);
(ثم args
يمكن أن تكون المستخدمة عالميا في استخدامها في Function.apply
.)
نصائح أخرى
وأعتقد أن "تطبيق" و "الحجج" مفهومان جافا سكريبت يمكنك استخدامها هنا:
function fireStartedEvent() {
for (var i = 0; i < startedListeners.length; i++) {
startedListeners[i].apply(startedListeners[i], arguments);
}
}
وفيما يلي بعض التعليمات البرمجية من وحدة الحرائق بلدي حاولت من ذلك بما يلي:
a = function(foo) { alert('a: ' + foo); };
b = function(foo, bar) { alert('b: ' + foo + ', ' + bar); };
startedListeners = [a, b];
function fireStartedEvent() {
for (var i = 0; i < startedListeners.length; i++) {
startedListeners[i].apply(startedListeners[i], arguments);
}
}
fireStartedEvent('one', 'two');