JavaScript - كيف يمكنني الاتصال بوظيفة من اسم سلسلة وتمرير كائن صفيف؟
-
20-09-2019 - |
سؤال
لقد حصلت على عنصر تحكم مستخدم يتيح للمستخدمين تقديم أسماء البرامج النصية الخاصة بهم والتي يطلق عليها عنصر التحكم في أحداث محددة.
لدي الرمز التالي:
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);