2012-02-24 2 views
39

Можно создать дубликат:
JavaScript: var functionName = function() {} vs function functionName() {}
Declaring functions in JavaScriptJavascript Функция Определение Синтаксис

Я видел 2 различных синтаксисом для определения функций в JavaScript:

function f() { 
    ... 
} 

Как как

var f = function() { 
    ... 
}; 

В чем разница между ними? Один из них устарел?

+0

Вот ответ на ваш вопрос: http://stackoverflow.com/a/1013387/236135 и вот вопрос, который был задан с правильными терминами http://stackoverflow.com/questions/1013385/what-is-the -difference-between-a-function-expression-vs-declaration-in-javascrip –

ответ

44

Не устарели, и оба будут работать. Разница здесь в том, что одна является именованной функцией (function f()), а другая - переменной, равной функции (var f = function()).

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

var f = function(n) { console.log(n); }; 
f(3); // logs 3 

Но это сломается, так как переменная определена после призыв к ней.

f(3); // what is f? breaks. 
var f = function(n) { console.log(n); }; 

Но нормальные функции работают нормально.

function abc(n) { console.log(n); } 

abc(3); // logs 3 
xyz(5); // logs 5 

function xyz(n) { console.log(n); } 

Это потому, что код анализируется перед исполнением, и все функции доступны для вызова. Но установка var, равная функции, подобна установке var для чего-либо еще. Порядок, когда это происходит, важен.

Теперь немного более запутанной вещи ...

Есть также «само-исполнение» анонимные функции. Они проходят разными именами. Наиболее распространенный способ сделать это выглядит примерно так:

(function() { 
    // code in here will execute right away 
    // since the() at the end executes this (function(){}) 
})(); 

Существует также, возможно, более качественная версия.

!function() { 
    // again, the tailing() will execute this 
}(); 

Заканчивать this Stack Overflow post больше анонимных функций.

+1

Вы также можете использовать самозапускаемые именованные функции: '(function foo() {...}())' или именованные функции, назначенные переменная: 'var foo = function bar() {...};'. Существенным отличием является то, что одно является объявлением * функции *, которое всегда должно быть названо, тогда как выражение функции * * может быть названо или анонимным. –

+0

@FelixKling Хорошая точка. Самозапускаемые именованные функции '(function foo() {...}())' интересны, так как вы можете называть 'foo' изнутри себя, но не снаружи. Даже при написании его как '! Function foo() {...}();'. – Marshall

+1

Да, когда у вас есть именованное функциональное выражение, имя доступно только внутри самой функции. К сожалению, IE имеет некоторые проблемы с именованными функциональными выражениями (он создает две копии одной и той же функции), поэтому лучше избегать.Но теоретически это работает;) –

Смежные вопросы