Разница между двумя функциями? ( "функция x" vs "var x = function" )
Возможный дубликат:
JavaScript: var functionName = function() {} vs function functionName() {}
Какая разница между:
function sum(x, y) {
return x+y;
}
// and
var sum = function (x, y) {
return x+y;
}
Почему один используется над другим?
Ответы
Ответ 1
Первая известна как именованная функция, а вторая - как анонимная функция.
Ключевое практическое отличие заключается в том, когда вы можете использовать функцию суммы. Например:-
var z = sum(2, 3);
function sum(x, y) {
return x+y;
}
z
назначается 5, тогда как это: -
var z = sum(2, 3);
var sum = function(x, y) {
return x+y;
}
Сбой, так как в то время, когда в первой строке выполнилась переменная sum, функция еще не была назначена.
Именованные функции анализируются и присваиваются их именам до начала выполнения, поэтому именованную функцию можно использовать в коде, который предшествует ее определению.
Переменные, назначенные функции по коду, могут быть явно использованы в качестве функции только после того, как выполнение завершится после назначения.
Ответ 2
Первое, как правило, используется по нескольким причинам:
Есть несколько предостережений, чтобы иметь в виду, хотя.
Не делайте
var sum = function sum(x, y) { ... };
в IE 6, так как это приведет к созданию двух объектов функции. Особенно запутанно, если вы делаете
var sum = function mySym(x, y) { ... };
Согласно стандарту, функция sum (x, y) {...}
не может появляться внутри блока if или тела цикла, поэтому различные интерпретаторы будут относиться к
if (0) {
function foo() { return 1; }
} else {
function foo() { return 2; }
}
return foo();
по-разному.
В этом случае вы должны сделать
var foo;
if (0) {
foo = function () { return 1; }
} ...
Ответ 3
Первый - это именованный оператор функции, второй присваивает выражение анонимной функции переменной.
Оператор функции добавляется в область действия сразу - вам не нужно запускать его перед тем, как его можно вызвать, поэтому это работает:
var y = sum(1, 2);
function sum(x, y) {
return x + y;
}
Но выражение функции присваивается переменной только при выполнении кода, поэтому это не работает:
// Error here because the function hasn't been assigned to sum yet.
var y = sum(1, 2);
var sum = function(x, y) {
return x + y;
}
Преимущество формы выражения заключается в том, что вы можете использовать его для назначения различных функций выражению в разных точках - так что вы можете изменить функцию или использовать другую в разных условиях (например, в зависимости от используемого браузера).
Преимущество именованного оператора функции заключается в том, что отладчики смогут отображать это имя. Хотя вы можете назвать выражения функций:
var sum = function sum(x, y) {
return x + y;
}
Но это может сбивать с толку, поскольку два имени фактически находятся в разных областях и относятся к различным вещам.
Ответ 4
Два фрагмента кода, которые вы разместили там, будут почти для всех целей вести себя одинаково.
Однако разница в поведении заключается в том, что со вторым вариантом эта функция может быть вызвана только после этой точки в коде.
В первом варианте функция доступна для кода, который выполняется выше, где объявлена функция.
Это связано с тем, что со вторым вариантом функция назначается переменной foo во время выполнения. В первом случае функция присваивается этому идентификатору foo во время разбора.
Дополнительная техническая информация
Javascript имеет три способа определения функций.
- Ваш первый пример - объявление функции . Для создания функции используется оператор "function". Функция предоставляется во время разбора и может быть вызвана в любом месте этой области. Вы можете сохранить его позже в переменной или объекте.
- Второй фрагмент показывает выражение функции. Это связано с использованием оператора "function" для создания функции - результат этого оператора может быть сохранен в любой переменной или объекте. Выражение функции является таким мощным. Выражение функции часто называют "анонимной функцией", поскольку оно не должно иметь имя,
- Третий способ определения функции - конструктор "Function()" , который не показан в исходном сообщении. Не рекомендуется использовать это, поскольку он работает так же, как eval(), у которого есть свои проблемы.
Ответ 5
Разница в том, что...
Это безымянная функция
var sum = function (x, y) {
return x+y;
}
Итак, если вы предупреждаете (суммируете); вы получаете "функцию (x, y) {return x + y;}" (безымянный)
Хотя это именованная функция:
function sum(x, y) {
return x+y;
}
Если вы предупреждаете (суммируете); теперь вы получаете "function sum (x, y) {return x + y;}" (name is sum)
Именованные функции помогают, если вы используете профилировщик, потому что профилировщик может сказать вам время выполнения sum... итератора вместо времени выполнения неизвестных функций... и т.д.
Ответ 6
вот еще один пример:
function sayHello (name) {alert ('hello' + name)}
теперь, предположим, что вы хотите изменить onclick-событие кнопки, например, он говорит "hello world"
вы не можете написать:
yourBtn.onclik = sayHello ('мир'), потому что вы должны предоставить ссылку на функцию.
то вы можете использовать вторую форму:
yourBtn.onclick = function() {sayHello ('workld'); }
Ps: извините за мой плохой английский!
Ответ 7
Они означают то же самое. Это просто синтаксический сахар. Последнее - ИМО, более раскрывающее то, что действительно делает JavaScript; т.е. "сумма" представляет собой просто переменную, инициализированную функциональным объектом, который затем может быть заменен чем-то другим:
$ js
js> function sum(x,y) { return x+y; }
js> sum(1,2);
3
js> sum=3
3
js> sum(1,2);
typein:4: TypeError: sum is not a function
js> sum
3