2013-04-12 7 views
6

Недавно я наткнулся на этот шаблон в источнике для https://github.com/yeoman/generator-webapp:Какова цель использования именованной функции при назначении переменной в JavaScript?

AppGenerator.prototype.packageJSON = function packageJSON() { 
    this.template('_package.json', 'package.json'); 
}; 

Какова цель дать функция название «packageJSON», когда вы собираетесь присвоить его переменной или свойство объекта в любом случае? В подобных случаях я всегда использовал анонимные функции.

+0

В противном случае эта функция не будет иметь имени в консоли, и вам будет сложно отслеживать, кто звонил, что дальше. – Joseph

+0

Это была моя первая мысль, но разве она не будет отображаться под именем свойства объекта, которому она была назначена и вызвана? – FriendOfFuture

+0

И не будет ли это имя переназначаться с помощью JS-кода, например, закрытия или uglify? – FriendOfFuture

ответ

6

Для целей отладки. Если вы используете именованную функцию, вы можете увидеть это имя в трассировке стека вызовов в ваших любимых инструментах dev. В противном случае вы увидите .

+0

Даю вам ответ, потому что это почти наверняка * почему * это делается. – FriendOfFuture

0

Это называется named function expression (или NFE), что облегчает процесс отладки.

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

var f = function foo(){ 
    return typeof foo; // "foo" is available in this inner scope 
}; 
// `foo` is never visible "outside" 
typeof foo; // "undefined" 
f(); // "function" 
0

В других говорится, для отладки в основном. Но не только это. Например, вы можете положиться на то, что в теле функции вы можете получить доступ к самой функции, используя имя, которое вы установили. Чтобы дать глупый пример:

var sum = function (a, b) { 
    if (a < 3) 
     return sum(3 + a, b); 

    return a + b; 
} 

sum(1, 2) // 3; 

Но давайте посмотрим, что происходит сейчас:

var aSum = sum; 
sum = null; 

aSum(1, 3); // TypeError: sum is not a function 

Именование функции, будет охватывать тот случай использования:

var sum = function sum(a, b) { 
    if (a < 3) 
     return sum(3 + a, b); 

    return a + b; 
} 

sum(1, 2) // 6 

var aSum = sum; 
sum = null; 

aSum(1, 2) // 6 

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