Передать анонимную функцию по значению в JavaScript?
У меня есть функция, которая принимает анонимную функцию в качестве аргумента и устанавливает ее для переменной (области) для справки. Затем я пытаюсь выполнить другую функцию с этой ссылкой, но она, очевидно, завершается сбоем, поскольку эта функция находится вне области видимости.
Мне было интересно, если бы кто-нибудь знал о простом способе передачи анонимной функции через анонимную функцию, избегая проблемы с областью видимости?
РЕДАКТИРОВАТЬ: Чтобы уточнить, элемент el определяется после того, как функция изолирована от списка аргументов. Кроме того, элемент el также является частью списка аргументов. Если бы этот код использовался только мной, я бы, вероятно, использовал список из двух аргументов со вторым аргументом, являющимся массивом или хеш-объектом, но, к сожалению, этот код будет использоваться некоторыми людьми, которые менее знакомы с JS или даже кодированием в этом отношении.
Спасибо за помощь!
Вот соответствующая часть моего кода:
locate : function(){
if ((!arguments)||(!arguments.length)) return;
arguments = [].splice.call(arguments,0); //This just converts arguments into an array
for (var i=0;i<arguments.length;i++){
if (typeof(arguments[i])=='function'){
var tf = arguments.splice(i,1);
break;
};
};
if (!tf) return;
JAS.Globals.eventListen('click',el,tf);
}
Это сокращенно, так что просто верьте, что el определен. JAS.Globals.eventListen - это просто интеллектуальный addEventListener.
3 ответа
var tf = arguments.splice(i,1)
Это возвращает массив в TF. EventListen ожидает массив? Если не использовать:-
var tf = arguments.splice(i,1)[0]
Поскольку у вас, похоже, нет других применений для других аргументов, почему вы все равно используете соединение?
Ты можешь сделать:
for (var i=0;i<arguments.length;i++){
if (typeof(arguments[i])=='function'){
JAS.Globals.eventListen('click',el,arguments[i]);
break;
}
}
или если вам нужно назначить событие после цикла по какой-то причине:
var tf;
for (var i=0;i<arguments.length;i++){
if (typeof(arguments[i])=='function'){
tf = arguments[i];
break;
}
}
if (!tf) return;
JAS.Globals.eventListen('click',el,tf);
Я не эксперт JS, не уверен, поможет ли это в вашем случае.
Но так как вы запрашиваете способ передать функцию "по значению"... вы можете пересоздать функцию, чтобы она снова стала анонимной, например:
JAS.Globals.eventListen('click', el,
new Function(tf.toString() + tf.name + "();")
Эта последняя часть состоит в том, что она создает новую функцию из исходного источника, полученного из tf.toString()
который выведет код определения функции с тем же именем функции, но в области функции, которая будет создана.
И тогда вы сразу же вызываете эту функцию с tf.name + "();"
,
Обратите внимание, что если у функции нет имени, вы можете обернуть его как встроенный вызов функции, то есть:
new Function("(" + tf.toString() + ")();");
Подводя итоги:
new Function(tf.name
? (tf.toString() + tf.name + "();") // func has a name, call by name
: ("(" + tf.toString() + ")();") // func don't have a name, call inline
Попробуйте в Firebug, чтобы понять, что я имею в виду.