У меня есть функция, которая принимает анонимную функцию в качестве аргумента и устанавливает для нее переменную (ограниченную) для справки. Затем я пытаюсь выполнить другую функцию с этой ссылкой, но это явно терпит неудачу, поскольку эта функция выходит за рамки.
Мне было интересно, знает ли кто-нибудь простой способ передать анонимную функцию прямо как анонимную функцию, избегая проблемы с областью видимости?
РЕДАКТИРОВАТЬ: Чтобы уточнить, элемент 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ты можешь сделать:
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);
К сожалению, в полном коде другие аргументы - это идентификаторы различных элементов (на которые указывает el), которые требуют присоединения функции. Таким образом, мне нужно изолировать функцию от идентификаторов.
@meouw: Я не совсем понимаю, какую проблему он видит. Похоже, он говорит, что tf выходит за рамки до назначения события, но вы правы, этого не должно быть ...
@Prestaul: Думаю, AnthonyWJones заметил проблему, уф! : o)
@ jean-charles: Я не думаю, что ясно, в чем ваша проблема. Не могли бы вы дать нам более подробную информацию? Цель - просто найти элемент с переданным идентификатором и анонимной функцией для использования в качестве обработчика кликов?
var tf = arguments.splice(i,1)
Это возвращает массив в tf. EventListen ожидает массив? Если не использовать: -
var tf = arguments.splice(i,1)[0]
Поскольку у вас, похоже, нет других вариантов использования ваших других аргументов, почему вы все равно используете splice?
Хороший улов. И хороший вопрос. Я думаю, что это может быть хорошим примером решения, усложняющего проблему ... @ jean-charles: Есть ли веская причина не использовать именованные аргументы или передавать объект в качестве аргумента?
Отличный улов! Я совсем забыл, что splice возвращает массив. Что касается вопроса, то смысл изолирования функции от остальных аргументов (в полном коде, фактически используемых) состоит в том, чтобы сделать ее как можно более динамичной. Думаю, у меня также может быть список с двумя аргументами (функция, {}).
Для записи eventListen не ожидал массива, поэтому проблема была решена. Спасибо!
Я не эксперт по 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, чтобы понять, что я имею в виду.
Но это не сработает для анонимной функции, не так ли? У функции анонса не будет имени.
например var f = function () {var dosomething = 'нет, спасибо'; }; console.info (имя файла); // выводит пустую строку
@Prestaul, тогда просто вызовите его без имени .... как если бы вы вызывали встроенную функцию: (function () {alert ('Эй! Никаких имен!');}) ();
JavaScript не имеет блочной области видимости, разве это не даст тот же результат?