анонимные и именованные функции сомневаются - PullRequest
2 голосов
/ 06 июля 2011

Во время отладки я обнаружил, что такого рода функции:

var f = function() {};

Появляются в стеке трассировки консоли разработчика firebug или webkits как anonymous, и по праву так.

Также явидел людей, определяющих это как:

var someName = function otherName(){};

Что довольно странно.Обратите внимание, что здесь вы не можете вызвать otherName() из любого места , но тело самого otherName.Отовсюду вы должны использовать someName().

Мои вопросы:

  • Есть ли какие-либо проблемы с именованием функции, отличной от переменной, в которой она хранится?

  • Имеет ли значение var a = function a(){} какую-либо разницу, кроме простого отображения имени в трассировке стека?

  • Любые другие советы / предложения по этой теме :)

Ответы [ 3 ]

3 голосов
/ 06 июля 2011

Нет проблем с присвоением функции с именем f переменной с именем a .

Хорошая справка по функциям: https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope.интерес представляет раздел, озаглавленный «Конструктор функции против объявления функции против выражения функции», в котором подробно обсуждается различие между именем функции и переменной, которой назначена функция.(Возможно, вы уже видели это.)

Я полагаю, причина в том, что отладчик печатает что-то вроде

var a = function a() {}

, состоит в том, что имя функции появляется, когда само значение функции сериализуется.Отладчик предоставляет вам всю имеющуюся информацию.

1 голос
/ 06 июля 2011

Обратите внимание, что здесь вы не можете вызывать otherName () из любого места, кроме самого тела otherName.

Не в IE (включая IE8).

См. http://kangax.github.com/nfe/#jscript-bugs для более именованных ошибок функций, очень хорошая статья.

0 голосов
/ 06 июля 2011

Не совсем. При var a = function b() {} именованная функция не поднимается, а ее прототип не имеет значимой модификации. Возьмите следующий код, например:

function foo() {
}
foo.prototype.bar = "hi";

var a = new foo();         // this inherits from function foo() above
var b = function foo() {}; // this has nothing to do with the above

console.log(a.bar); // returns "hi" due to inheritance
console.log(b.bar); // returns undefined; its prototype is a new named
                    // function

var c = function() {};
var d = function d() {};

console.log(c.name); // returns ""
console.log(d.name); // returns "d"

AFAICT, основной полезный метод - иметь name легкодоступный (в основном для формы var a = function a(){}), что может быть полезным в некоторых крайних случаях, я думаю, в основном в обработке ошибок .

...