Все больше и больше я вижу, что функции объявляются как
var foo = function() {
// things
};
Вместо того, как я узнал, как
function foo() {
// things
}
Какая разница? Лучшая производительность? Объем? Должен ли я использовать этот метод?
javascript
functions
Стив Роббинс
источник
источник
Ответы:
var foo = function() {}
определяет переменную, которая ссылается на анонимную функцию.function foo() {}
определяет именованную функциюfoo
.Либо может быть передано по имени в качестве параметров функции, либо может быть создан экземпляр, если предполагаемое использование для ООП.
В конце концов, какой из них вы используете, в значительной степени продиктован вашим конкретным вариантом использования (Javascript очень интересен;)). Если вы в конечном итоге используете первый, я настоятельно рекомендую вам назвать функцию:
var foo = function MY_function() {}
, Это соглашение об именах помогает вашему стеку вызовов отладчика не быть бесполезным.источник
foo
функцияMY_function
выражение функции:
В этом случае выражение func является анонимным, но присваивается переменной var для справки. Это отличается от помеченного оператора функции следующими способами:
new someFunction().constructor.name === 'someFunction';//false
экземпляры не получают имя переменной для constructor.name, потому что ссылка на функцию назначена переменной, но переменная, а не функция, привязана к имени переменнойВ помеченном операторе функции:
new someFunction().constructor.name === 'someFunction'; //true
имя напрямую связано с функцией.Вообще говоря, на самом деле нет особой причины делать выражение для var, если только вы не хотите, чтобы вызовы не выполнялись, если что-то перемещается или вы определяете / назначаете метод в одной строке. Я на самом деле считаю подъем полезным для организации объектов с внутренними определениями функций и методов в нижней части, чтобы я мог перейти к реальному поведению объекта и выполнить однострочные публичные определения методов (просто назначив функции
this.
с одинаковыми именами) все в одном место для удобства пользования. Вы должны всегда пытаться использовать помеченные операторы для конструкторов, IMO, чтобы вы могли определить «тип» объекта через его конструктор.источник
Ваш первый пример - это выражение, а второй пример - это выражение . Определение функций в качестве выражений обеспечивает большую гибкость в отношении того, где может происходить определение, что вы можете назначить, что вы можете передать как параметр и т. Д.
Например:
против ...
Более сложные примеры стали бы чрезвычайно сложными без синтаксиса выражения функции.
Посмотрите на /programming/111102/how-do-javascript-closures-work
источник
Основное практическое отличие - подъем. Например:
против
Кроме того, это неопределенное поведение
пока это нормально.
источник
if
оператора!