كيفية كتابة وظيفة JS أن يقبل و "إلى الأمام" متغير عدد من المعلمات ؟

StackOverflow https://stackoverflow.com/questions/1619850

سؤال

كيف يمكنني كتابة وظيفة جافا سكريبت التي تقبل متغير عدد من المعلمات ، وإلى الأمام كل تلك المعايير الأخرى مجهول الوظائف ؟

على سبيل المثال في السيناريو من طريقة الحرائق الحدث:

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');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top