Как сказано в названии, в чем разница между
MyFunction = function() {
}
а также
function MyFunction() {
}
Ничего такого?
Дубликат:var functionName = function () {} vs functionName () {}
Я предпочитаю добавлять их к вопросу - думаю, их легче найти
@RoBorg достаточно честно. Когда посмотрел, нигде не было было все :)
черт возьми, извини за это. не заметил обмана.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю ты имеешь в виду
var MyFunction = function() {
}
И во многих случаях разница невелика.
Синтаксис var иногда бывает полезен, когда вы находитесь внутри какого-то класса-оболочки и хотите быть уверенным в своем пространстве имен (например, в greasemonkey).
Кроме того, я считаю, что функции-конструкторы (с .prototype и т.д.) не работают с синтаксисом var.
Первая форма - это фактически переменная с присвоенным ей анонимная функция, вторая - объявленная функция.
Они являются взаимозаменяемыми почти, но имеют некоторые отличия: отладчикам сложнее работать с анонами (потому что у них нет имени), а движок JS может напрямую обращаться к объявленным функциям, где бы они ни были в скрипте, но к анонам нельзя получить доступ, пока они были назначены.
вот одно отличие:
function Moose() {
alert(arguments.callee.name); // "Moose"
}
var Cow = function() {
alert(arguments.callee.name); // ""
}
В Firefox есть одна тонкая разница, когда вы объявляете оконный обработчик событий load. Объявление следующего в теге скрипта работает только в Firefox:
function onload() {
alert(42);
}
Вы должны сделать это для IE, Opera, Safari или Chrome:
onload = function () {
alert(42);
}
разве это не другая проблема? onload не является локальным - это член окна. ваш код действительно говорит: "window.onload = function () {blah}", а это совсем другая идея.
первая будет работать, потому что фактически существует неявный with (window), поэтому он фактически присваивается window.onload, и был бы так же сломан, как и вторая форма, если бы она была объявлена "var onload ..." - это абсолютно ужасная реализация привязки события onload, хотя
@Jimmy: Независимо от того, является ли это другой «проблемой» по сути или нет, это ответ на вопрос, есть ли «абсолютно никакой разницы» между двумя типами объявлений. Похоже, существует один странный сценарий.
@annakata: Я согласен, что первая форма абсолютно ужасна. Я просто пытаюсь проиллюстрировать разницу в поведении, которую я случайно обнаружил, играя с фреймворком модульного тестирования.
это не разница в поведении, потому что он делает что-то совершенно другое - это один из тех моментов, когда "ложки нет"
function myFunction(){} совпадает с var myFunction = function myFunction(){}. Если вы просто выполняете MyFunction = function(){}, это похоже на MyFunction = function anonymous(){}.
Переменные и функции имеют разные области действия, но на функцию можно ссылаться вне функции только через имя переменной, которое должно быть привязано к функции.
function myFunction(){} связывает переменную myFunction с функцией, которая случайно имеет то же имя.
Вы так думаете, но есть очень тонкая разница. В качестве очень простого примера (из-за ограничения количества символов) var foo = function () {alert (foo)}; f = foo; foo = 5; f () // предупреждает "5" var foo = function foo () {alert (foo);} f = foo; foo = 5; f () // предупреждает с нашей функцией
И я был бы прав для вашего случая: собственное имя функции находится в ее собственной области видимости, тогда как внешнее «foo» находится во внешней области.
Если вы закроете повторение, не могли бы вы прокомментировать, указав ссылку на то, что это дубликат?