В чем разница между этими двумя типами синтаксиса функций

Как сказано в названии, в чем разница между

MyFunction = function() {

}

а также

function MyFunction() {

}

Ничего такого?

Дубликат:var functionName = function () {} vs functionName () {}

Если вы закроете повторение, не могли бы вы прокомментировать, указав ссылку на то, что это дубликат?

singpolyma 17.12.2008 19:44

Я предпочитаю добавлять их к вопросу - думаю, их легче найти

Greg 17.12.2008 19:49

@RoBorg достаточно честно. Когда посмотрел, нигде не было было все :)

singpolyma 17.12.2008 20:09

черт возьми, извини за это. не заметил обмана.

jdee 17.12.2008 20:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
410
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Я думаю ты имеешь в виду

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}", а это совсем другая идея.

Jimmy 17.12.2008 19:44

первая будет работать, потому что фактически существует неявный with (window), поэтому он фактически присваивается window.onload, и был бы так же сломан, как и вторая форма, если бы она была объявлена ​​"var onload ..." - это абсолютно ужасная реализация привязки события onload, хотя

annakata 17.12.2008 19:46

@Jimmy: Независимо от того, является ли это другой «проблемой» по сути или нет, это ответ на вопрос, есть ли «абсолютно никакой разницы» между двумя типами объявлений. Похоже, существует один странный сценарий.

Ates Goral 17.12.2008 19:50

@annakata: Я согласен, что первая форма абсолютно ужасна. Я просто пытаюсь проиллюстрировать разницу в поведении, которую я случайно обнаружил, играя с фреймворком модульного тестирования.

Ates Goral 17.12.2008 19:52

это не разница в поведении, потому что он делает что-то совершенно другое - это один из тех моментов, когда "ложки нет"

annakata 17.12.2008 20:00

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 () // предупреждает с нашей функцией

olliej 18.12.2008 06:29

И я был бы прав для вашего случая: собственное имя функции находится в ее собственной области видимости, тогда как внешнее «foo» находится во внешней области.

Mark Cidade 18.12.2008 22:03

Другие вопросы по теме