Передать анонимную функцию по значению в 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, чтобы понять, что я имею в виду.

Другие вопросы по тегам