Частично это зависит от того, используете ли вы выражение функции или объявление функции .Это разные вещи, они случаются в разное время и по-разному влияют на окружающую сферу.Итак, давайте начнем с различия.
Функция выражение - это function
производство, где вы используете результат в качестве значения правой руки - например, вы присваиваете результатв переменную или свойство, или передачу его в функцию в качестве параметра и т. д. Это все функции выражения :
setTimeout(function() { ... }, 1000);
var f = function() { ... };
var named = function bar() { ... };
(не используйте этот последний - которыйназывается выражением именованной функции - в реализациях есть ошибки, в частности IE .)
Напротив, это объявление функции :
function bar() { ... }
Это автономно, вы не используете результат в качестве значения правой руки.
Два основных различия между ними:
Выражения функций оцениваются там, где они встречаются в потоке программы.Объявления оцениваются, когда элемент управления входит в содержащую область (например, содержащую функцию или глобальную область).
Имя функции (если она есть) определяется в содержащейобласть действия для функции объявление .Это не для функции выражение (исключая ошибки браузера).
Ваши анонимные функции - выражения функций , и, таким образом, запрет интерпретатору делаетОптимизация (что бесплатно), они будут воссозданы в каждом цикле.Поэтому вы можете использовать его хорошо, если думаете, что реализации оптимизируют, но разбиение его на именованную функцию имеет другие преимущества и, что немаловажно, ничего не стоит.Кроме того, см. ответ Касабланки , где приведено примечание о том, почему интерпретатор не может в состоянии оптимизировать воссоздание функции на каждой итерации в зависимости от того, насколько глубоко он проверяет ваш код.
Большая проблема была бы, если бы вы использовали функцию объявление в цикле, тело условия и т. Д.:
function foo() {
for (i = 0; i < limit; ++i) {
function bar() { ... } // <== Don't do this
bar();
}
}
Технически, подробное чтение спецификацииграмматика показывает, что это недопустимо для этого, хотя практически ни одна реализация на самом деле не обеспечивает это.Чем отличаются реализации do , и лучше держаться от них подальше.
За мои деньги лучше всего использовать объявление одной функции, например:
function foo() {
for (i = 0; i < limit; ++i) {
bar();
}
function bar() {
/* ...do something, possibly using 'i'... */
}
}
Вы получаете тот же результат, нет никакой возможности, что реализация создаст новую функцию в каждом цикле, вы получите преимущество функции, имеющей имя , и вы ничего не потеряете.