Именование анонимной функции

17

Можно ли как-то установить имя для анонимных функций?

Нет необходимости добавлять имена функций в пространство имен для анонимных функций, но я хотел бы избежать увидеть большое количество (?) в моем отладчике javascript, чтобы я мог поддерживать трассировку стека вызовов информативной.

Также я могу безопасно передавать обычные объявленные функции в качестве аргументов вместо анонимных функций, или я буду входить в некоторые странные ошибки. Кажется, что это работает.

$("object").bind("click", function() { alert("x"); });

$("object").bind("click", function debuggingName() { alert("x"); });

[изменить]

Я имел в виду что-то вроде

$("object").bind("click", function() { Function.Name = "debuggingName"; alert("x"); });
    
задан Raynos 04.10.2010 в 11:57
источник
  • @Raynos - анонимная функция - это противоречие в терминах! –  InSane 04.10.2010 в 12:00
  • Вы получаете некоторую ошибку, когда используете вторую конструкцию выше? –  Sachin Shanbhag 04.10.2010 в 12:00
  • Я просто хочу установить что-то в анонимной функции, которую отладчик может выбрать и отобразить как полезное имя функции отладки. Я хочу использовать их точно так же, как использовать анонимные функции –  Raynos 04.10.2010 в 12:27
  • @raynos: вы пробовали $ («объект»). bind («click», function MY_NOT_SO_ANONYMOUS_FUNCTION_NAME () {alert ("x");}); –  some 04.10.2010 в 14:17
  • @Raynos: Извините, я, должно быть, пропустил то, что вы уже писали это. Это точно так же, как ваш второй пример. –  some 04.10.2010 в 15:40

4 ответа

17

В вашем втором примере используется выражение named function , которое отлично работает в большинстве браузеров, но имеет некоторые проблемы в IE, о которых вы должны знать, прежде чем использовать его. Я рекомендую прочитать отличную статью kangax по этому вопросу .

    
ответ дан Tim Down 04.10.2010 в 12:18
  • Спасибо, я был обеспокоен тем, что передача имени функции может вызвать ошибки. –  Raynos 04.10.2010 в 12:23
  • О, это прекрасная статья. Я не заметил, что было какое-то различие между именованными выражениями функций и объявлением функции. –  Raynos 04.10.2010 в 12:30
  • Да, я просто написал комментарий, указывающий на то, что :) –  Tim Down 04.10.2010 в 12:31
  • Хотя я считаю, что мой второй пример выше - это оператор функции. Unles, который вы считаете назначением объявления функции аргументам [1], как именованное выражение функции. И у меня началось ощущение, что я понял javascript. –  Raynos 04.10.2010 в 12:43
  • Ваш второй пример - это явно названное функциональное выражение. Он выглядит идентично объявлению функции, кроме контекста: объявление функции недействительно, где ожидается выражение (например, при передаче параметра функции, как это делает ваш пример). Оператор функции - это совсем другое: это расширение Mozilla для ECMAScript для предотвращения объявления функции внутри, скажем, блока if, являющегося синтаксической ошибкой. В статье kangax также сказано: kangax.github.com/nfe/#function-statements –  Tim Down 04.10.2010 в 12:49
Показать остальные комментарии
0

Я обычно делаю:     $ ( "Объект"). Bind ( "щелчок"       , имя функции () {           предупреждение ( "х");     });

и не сталкиваются с какими-либо проблемами.

Это рекомендуется в некоторых из основных библиотек:

Ссылка

Ссылка

    
ответ дан Andrew Luhring 12.11.2014 в 09:47
0

Если это имя функции динамическое . Вы можете попробовать следующее:

function renameFunction(name, fn) {
    return (new Function("return function (call) { return function " + name +
       " () { return call(this, arguments) }; };")())(Function.apply.bind(fn));
} 

renameFunction('dynamicName',function() { debugger })();

источник: Нейт Ферреро в Как динамически установить имя функции / объекта в Javascript, поскольку оно отображается в Chrome

    
ответ дан Shai Ben-Yehuda 17.11.2015 в 14:18
  • Я только что видел лучшее решение для этого в stackoverflow.com/questions/5871040/... –  Shai Ben-Yehuda 17.11.2015 в 14:31
  • Никогда не делайте этого. Это глупо и многословно. –  Kutsan Kaplan 11.11.2016 в 20:26
-3

Анонимная функция - это функция без имени, она выполняется из того, где она определена. В качестве альтернативы вы можете определить функцию отладки перед ее использованием.

function debuggingName() { 
    alert("x"); 
}

$("object").bind("click", debuggingName);
    
ответ дан Q_Mlilo 04.10.2010 в 12:14