JavaScript - كيف يمكنني الاتصال بوظيفة من اسم سلسلة وتمرير كائن صفيف؟

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

سؤال

لقد حصلت على عنصر تحكم مستخدم يتيح للمستخدمين تقديم أسماء البرامج النصية الخاصة بهم والتي يطلق عليها عنصر التحكم في أحداث محددة.

لدي الرمز التالي:

initialize : function()
{

    // Call the base initialize method
    Point74.WebAutoComplete.callBaseMethod(this, 'initialize');

    $(document).ready(
        Function.createDelegate(this, this._onDocumentReady)
    );

},

_onDocumentReady : function()
{
    var me = this;
    $("#" + me.get_id()).autocomplete(me.get_ashxAddress(), 
        { 
            formatItem: function(item)
            {
                return eval(me.get_formatFunction() + "(" + item + ");");
            }
        } 
    ).result(me.get_selectFunction());
}

يحتوي me.get_formatfunction على اسم وظيفة ، أي "formatitem". يستخدم هذا المثال حاليًا Eval ، الذي لا أريد استخدامه ... بالإضافة إلى أن هذا المثال لا يعمل على أي حال ، لكنني اعتقدت أنني سأظهر ما أحاول الحصول عليه.

في المثال أعلاه ، أحصل على خطأ غير محدد في القيمة لأن "العنصر" عبارة عن صفيف سلسلة ويحاول تقييمه تحويله إلى سلسلة طويلة.

كيف يمكنني تحقيق هذه الوظيفة ، لا يزال أي منها يمر عبر "عنصر" كصفيف سلسلة إلى الوظيفة المسماة؟

إذا كانت الوظائف المسمى فكرة سيئة ، فهل هناك أي بدائل؟

هذه هي الطريقة التي يتم بها إعلان سيطرتي:

<p74:WebAutoComplete runat="server" ID="ato_Test" AshxAddress="WebServices/SearchService.ashx" 
     FormatFunction="formatItem" SelectFunction="searchSelectedMaster" />
هل كانت مفيدة؟

المحلول

me[me.get_formatFunction()](item);

نصائح أخرى

إذا كانت نيتك هي تمرير جميع الوسائط إلى الوظيفة المحددة للمستخدم التي يتم تمريرها إلى FormatItem () ، ثم بدلاً من استخدام:

formatItem: function(item)
{
 return eval(me.get_formatFunction() + "(" + item + ");");
}

يستخدم:

formatItem: function()
{
 return me.get_formatFunction().apply(me, arguments));
}

يمكن استدعاء طريقة تطبيق () على كائن دالة ، من أجل استدعاء هذه الوظيفة باستخدام مجموعة "هذا" المحددة "ومجموعة الوسيطة. نرى: http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-function-call-in-javascript.aspx للحصول على شرح للاتصال () وتطبيق () وظائف في JavaScript.

بعد ذلك ، ستحتاج إلى get_formatfunction () لإرجاع كائن دالة ، بدلاً من مجرد اسم الوظيفة ؛ أو يمكنك المحاولة:

me[me.get_formatFunction()]

... للحصول على وظيفة يتم تعريفها على "أنا" باسمها. (لاحظ أنه إذا قام get_formatfunction () بإرجاع السلسلة "myfunc" ، فإن هذا يعادل Me.Myfunc)

تحرير: تم تغيير الإشارات إلى "هذا" لاستخدام "لي" بدلاً من ذلك

لست متأكدًا من خطتك العامة ، ولكن يمكنك تمرير وظائف حول نفسها بدلاً من أسمائهم:

function Foo(x, y) {
  // do something
}

function Bar(f, a, b) {
  // call Foo(a,b)
  f(a,b);
}

Bar(Foo, 1, 2);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top