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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 793
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

JavaScript не имеет блочной области видимости, разве это не даст тот же результат?

meouw 09.01.2009 19:43

К сожалению, в полном коде другие аргументы - это идентификаторы различных элементов (на которые указывает el), которые требуют присоединения функции. Таким образом, мне нужно изолировать функцию от идентификаторов.

Jean-Charles 09.01.2009 19:44

@meouw: Я не совсем понимаю, какую проблему он видит. Похоже, он говорит, что tf выходит за рамки до назначения события, но вы правы, этого не должно быть ...

Prestaul 09.01.2009 19:46

@Prestaul: Думаю, AnthonyWJones заметил проблему, уф! : o)

meouw 09.01.2009 19:48

@ jean-charles: Я не думаю, что ясно, в чем ваша проблема. Не могли бы вы дать нам более подробную информацию? Цель - просто найти элемент с переданным идентификатором и анонимной функцией для использования в качестве обработчика кликов?

Prestaul 09.01.2009 19:49
Ответ принят как подходящий
 var tf = arguments.splice(i,1)

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

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

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

Хороший улов. И хороший вопрос. Я думаю, что это может быть хорошим примером решения, усложняющего проблему ... @ jean-charles: Есть ли веская причина не использовать именованные аргументы или передавать объект в качестве аргумента?

Prestaul 09.01.2009 19:53

Отличный улов! Я совсем забыл, что splice возвращает массив. Что касается вопроса, то смысл изолирования функции от остальных аргументов (в полном коде, фактически используемых) состоит в том, чтобы сделать ее как можно более динамичной. Думаю, у меня также может быть список с двумя аргументами (функция, {}).

Jean-Charles 09.01.2009 19:59

Для записи eventListen не ожидал массива, поэтому проблема была решена. Спасибо!

Jean-Charles 09.01.2009 20:00

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

Но это не сработает для анонимной функции, не так ли? У функции анонса не будет имени.

Prestaul 09.01.2009 20:00

например var f = function () {var dosomething = 'нет, спасибо'; }; console.info (имя файла); // выводит пустую строку

Prestaul 09.01.2009 20:01

@Prestaul, тогда просто вызовите его без имени .... как если бы вы вызывали встроенную функцию: (function () {alert ('Эй! Никаких имен!');}) ();

chakrit 09.01.2009 20:11

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