Вопрос по javascript – Являются ли именованные функции предпочтительнее анонимных функций в JavaScript? [Дубликат]

47

Possible Duplicate:
JavaScript: var functionName = function() {} vs function functionName() {}

Есть два возможных метода извлечения функции в Javascript:

var foo = function() { ... }

Это немного надумано; Другой распространенный шаблон:

var foo = {
   baz: 43,
   doSomething: function() {
       // ...
   }
}

против

function foo() { 
  // ... 
}

Есть ли явная причина отдать предпочтение одному или другому?

@amnotiam: Согласен. Проголосовал за закрытие. Billy ONeal
Error: User Rate Limit Exceeded Waynn Lue
Это хорошая статьяkangax.github.com/nfe The Alpha

Ваш Ответ

4   ответа
71

Error: User Rate Limit Exceeded

function foo() {
    bar();
    var x = 1;
}

Error: User Rate Limit Exceeded

function foo() {
    var x;
    bar();
    x = 1;
}

Error: User Rate Limit Exceeded

function test() {
    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"
    var foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
    function bar() { // function declaration, given the name 'bar'
        alert("this will run!");
    }
}
test();

Error: User Rate Limit Exceeded

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

foo(); // TypeError "foo is not a function"
bar(); // valid
baz(); // TypeError "baz is not a function"
bin(); // ReferenceError "bin is not defined"

var foo = function () {}; // anonymous function expression ('foo' gets hoisted)
function bar() {}; // function declaration ('bar' and the function body get hoisted)
var baz = function bin() {}; // named function expression (only 'baz' gets hoisted)

foo(); // valid
bar(); // valid
baz(); // valid
bin(); // ReferenceError "bin is not defined"

Error: User Rate Limit Exceededfunction declaration иначе использоватьexpressionError: User Rate Limit Exceededfunction expressions.

названныйfunction expressionsError: User Rate Limit Exceededanonymous акаstack trace.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededtechnically invalidError: User Rate Limit Exceeded
Error: User Rate Limit ExceededifError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

Named vs anonymous?

Function declaration vs function expression?

2

names for meta analysis. functionInstance.name will show you the name. Far more importantly, the name will be printed in stack traces. names also help write self documenting or literate code.

IE has memory leaks for NFE

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Billy ONeal
10

function() { ... }function expression2 или же[4,5]valuevar foo=function(){ ... }

function foo() { ... }var foo=function(){...}

:

function test() {
    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"
    var foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
    function bar() { // function declaration, given the name 'bar'
        alert("this will run!");
    }
}
test();

in theory

function test() {
    var foo;//foo hoisted to top
    var bar=function(){//this as well
        alert("this will run!");
    }

    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"
    var foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
}

function foo() {...}

(function foo() { return 1; })();// 1
foo; //ReferenceError: foo is not defined

Summary var foo=function(){ ... }foo(){ ... }

please use function expressions( var f=function(){...}

kinda sorta

var foo = {
    baz: 43,
    doSomething:function() {
        ...
    }
}

{ name1: val1, .... namek:valk }

var obj={ name1: val1, .... namek:valk }

obj.name1==val1;
obj['name1']==val1;// x['y'] is the same thing as x.y 
...
obj.namek==valk;

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededvar foo = {...Error: User Rate Limit Exceededbased onError: User Rate Limit Exceeded
rtpg, вы хорошо объяснили разницу и очень настоятельно рекомендовали использовать выражения функций. Однако ваши причины для этого следующие: "нет причин не делать этого". Тот, кто имеет противоположное мнение, не будет убежден. Только тот, кто уже согласен с вами, согласится. Я предлагаю показать несколько примеров того, что было бы плохо, если бы кто-то использовал объявление функции.
Обычно, если вы определяете литерал объекта в коде JavaScript, мы не называем его JSON, поскольку остальная часть кода JS делает его недействительным JSON. И наоборот, если мы удалим все JS и будем иметь отдельную структуру JSON, такую как{"foo":"bar"}Error: User Rate Limit ExceededSyntaxErrorError: User Rate Limit ExceededgeneralError: User Rate Limit Exceeded

Похожие вопросы