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_formatфункция содержит имя функции, т. е."Форматирование".В этом примере в настоящее время используется eval, который я не хочу использовать...к тому же этот пример все равно не работает, но я подумал, что покажу, к чему я пытаюсь прийти.
В приведенном выше примере я получаю ошибку value undefined, поскольку 'item' представляет собой массив строк, и eval пытается преобразовать его в одну длинную строку.
Как я могу достичь этой функциональности, если кто-либо все еще передает 'item' в виде массива строк в именованную функцию?
Если передача именованных функций - плохая идея, есть ли какие-либо альтернативы?
Вот как объявляется мой контроль:
<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));
}
Метод apply() может быть вызван для объекта function, чтобы вызвать эту функцию, используя указанный "this" и массив аргументов.Видишь: http://odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspx для объяснения функций call() и apply() в javascript.
Затем вы захотите, чтобы get_formatFunction() возвращала объект функции, а не просто имя функции;или вы можете попробовать:
me[me.get_formatFunction()]
...чтобы получить функцию, которая определена на 'me' по ее имени.(Обратите внимание, что если 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);