Они делают почти одно и то же, но есть различия и причины для того и другого. Первое выражение функции, потому что оно назначено переменной. Кроме того, это не относится к выражению функции, это анонимная функция, потому что у нее нет имени функции. Второе - это объявление функции, потому что оно не является частью другого выражения и является «элементом источника (не вложенная инструкция в скрипте или функция тела) функции скрипта». (Я не совсем знаю, как объяснить исходный элемент, поэтому я скопировал это из документации Mozilla). У этого также есть имя функции, myFunction. Кроме того, функция может также использоваться перед объявлением функции, в отличие от функций, определенных выражением функции.
Следующий пример использования выражения функции не будет работать:
plusOne(1);
var plusOne = function (x) {
return x + 1;
};
Будет работать следующее, используя объявление функции:
plusOne(1);
function plusOne(x) {
return x + 1;
};
Кроме того, учитывая, что темой ссылки, по которой вы видели это объявление функции, являются замыкания, я продолжу объяснять, почему вы можете использовать выражение функции и анонимную функцию. Иногда функция просто не нуждается в имени и может быть анонимной, потому что никому не нужно вызывать ее по имени. Выражение функции можно использовать для чего-то, о чем вы, возможно, уже узнали, называемого замыканиями. Закрытие - это когда функция заключает в себе переменные для последующего использования внутри нее, предотвращая достижение какой-либо внешней области видимости. Их немного сложно объяснить, и их также сложно понять, не пройдя несколько примеров и попробовав их самостоятельно.
Предполагая, что у вас достаточно базовых знаний javascript (для циклов, создания и добавления элементов dom и onclick), возьмите, например, следующий код, который похож на проблему, с которой я столкнулся до того, как обнаружил замыкания самостоятельно. Прочтите его, не запуская сначала код, и попытайтесь выяснить, что произойдет, когда вы нажмете каждую кнопку / div.
function addButtons() {
for (var i=0; i<3; i++) {
button = document.createElement("div");
button.innerHTML = "Button " + i;
button.onclick = function () {
alert(i);
};
document.body.appendChild(button);
}
}
addButtons();
Можно ожидать, что кнопка 1 выдаст предупреждение «1», а кнопка 2 выдаст предупреждение «2», а кнопка 3 выдаст предупреждение «3». Однако, что происходит, все кнопки будут предупреждать «3». Это связано с тем, что onclick не выполняется до тех пор, пока переменная i не будет увеличена до 3.
Теперь прочитайте следующий бит кода. Поначалу это может показаться немного запутанным.
function addButtons() {
for (var i=0; i<3; i++) {
var button = document.createElement("div");
button.innerHTML = "Button " + i;
button.onclick = function (j) {
return function () {
alert(j);
}
}(i);
document.body.appendChild(button);
}
}
addButtons();
Если вы запустите его, вы увидите, что каждая кнопка оповещает о том, что вы, вероятно, ожидали, что они произойдут в первую очередь. Кнопка 1 выдаст предупреждение «1», кнопка 2 выдаст предупреждение «2», а кнопка 3 выдаст предупреждение «3». Итак, onlick возвращает замыкание, ссылающееся на j, которое устанавливается с i во время цикла for. Переменная j надежно хранится в замыкании, в отличие от i, которая меняется в каждом цикле. И, конечно, вы можете по-прежнему называть функции, используемые в замыкании, если хотите, но для этого нет причин.
Я не уверен, что объяснил это отлично, но я надеюсь, что это, по крайней мере, введение в нечто новое и полезное! Кроме того, вы можете найти гораздо больше информации о функциях в Mozilla Developer Network .