Передать анонимную функцию по значению в JavaScript? - PullRequest
1 голос
/ 09 января 2009

У меня есть функция, которая принимает анонимную функцию в качестве аргумента и устанавливает ее для переменной (области) для справки. Затем я пытаюсь выполнить другую функцию с этой ссылкой, но она, очевидно, завершается сбоем, поскольку эта функция находится вне области действия.

Мне было интересно, если бы кто-нибудь знал о простом способе передачи анонимной функции прямо как анонимной функции, избегая вопроса об ограничении?

EDIT : Для пояснения, элемент 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 ]

3 голосов
/ 09 января 2009
 var tf = arguments.splice(i,1)

Возвращает массив в tf. EventListen ожидает массив? Если не использовать: -

 var tf = arguments.splice(i,1)[0]

Поскольку у вас, похоже, нет других применений для других аргументов, почему вы все равно используете соединение?

0 голосов
/ 09 января 2009

Я не эксперт по 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, чтобы понять, о чем я.

0 голосов
/ 09 января 2009

Вы можете сделать:

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);
...