Почему вам нужно вызывать анонимную функцию в той же строке?

Я читал несколько сообщений о закрытии и видел это повсюду, но нет четкого объяснения, как это работает - каждый раз, когда мне просто говорили использовать его ...:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

Хорошо, я вижу, что мы создадим новую анонимную функцию, а затем выполним ее. Итак, после этого этот простой код должен работать (и он работает):

(function (msg){alert(msg)})('SO');

У меня вопрос, что за волшебство здесь происходит? Я думал об этом, когда писал:

(function (msg){alert(msg)})

тогда будет создана новая безымянная функция типа function "" (msg) ...

но тогда почему это не работает?

(function (msg){alert(msg)});
('SO');

Почему он должен быть в одной строке?

Не могли бы вы указать мне на несколько сообщений или дать объяснение?


person palig    schedule 16.07.2009    source источник
comment
На других языках они называются указателями функций или делегатами, если вы хотите изучить задействованные структуры нижнего уровня.   -  person Chris Moschini    schedule 16.11.2011
comment
У тебя есть ; в первой строке   -  person Oliver Ni    schedule 30.11.2013
comment
Теперь, когда вы знаете, как это работает ... Не используйте его. Нам следует прекратить писать анонимные функции. С помощью всего лишь нескольких символов мы можем дать нашим функциям настоящее имя и значительно упростить отладку кода Javascript!   -  person Stijn de Witt    schedule 14.05.2014
comment
Линия (function (msg){alert(msg)})('SO'); работает полностью сама по себе. Это не имеет ничего общего с другой анонимной функцией, которую вы опубликовали до этого. Это две совершенно разные анонимные функции. Вы должны немедленно вызвать анонимную функцию, потому что у нее нет имени, и на нее нельзя будет ссылаться впоследствии.   -  person Octopus    schedule 25.03.2015


Ответы (19)


Отбросьте точку с запятой после определения функции.

(function (msg){alert(msg)})
('SO');

Выше должно работать.

ДЕМО-страница: https://jsfiddle.net/e7ooeq6m/

В этом посте я обсуждал этот тип шаблона:

jQuery и $ questions

РЕДАКТИРОВАТЬ:

Если вы посмотрите спецификацию сценария ECMA, там есть 3 способа определить функцию. (Стр. 98, Раздел 13 Определение функций)

1. Использование конструктора функций

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2. Использование объявления функции.

function sum(a, b)
{
    return a + b;
}

alert(sum(10, 10)); //Alerts 20;

3. Функциональное выражение

var sum = function(a, b) { return a + b; }

alert(sum(5, 5)); // alerts 10

Вы можете спросить, в чем разница между объявлением и выражением?

Из спецификации сценария ECMA:

FunctionDeclaration: идентификатор функции (FormalParameterListopt) {FunctionBody}

FunctionExpression: функция Identifieropt (FormalParameterListopt) {FunctionBody}

Если вы заметили, «идентификатор» является необязательным для выражения функции. А когда вы не даете идентификатор, вы создаете анонимную функцию. Это не значит, что вы не можете указать идентификатор.

Это означает, что верно следующее.

var sum = function mySum(a, b) { return a + b; }

Важно отметить, что вы можете использовать mySum только внутри тела функции mySum, но не снаружи. См. Следующий пример:

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise! 

test1(); //alerts 'function' because test2 is a function.

Живая демонстрация

Сравните это с

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

Вооружившись этими знаниями, попробуем проанализировать ваш код.

Когда у вас есть такой код,

    function(msg) { alert(msg); }

Вы создали выражение функции. И вы можете выполнить это функциональное выражение, заключив его в круглые скобки.

    (function(msg) { alert(msg); })('SO'); //alerts SO.
person Community    schedule 16.07.2009
comment
Да, но почему? Почему он должен быть встроенным? Независимо от того, сколько белого пространства я использую. - person palig; 17.07.2009
comment
Как я уже писал, точка с запятой завершает определение анонимной функции. Поскольку у него нет имени (это анонимно!), Вы больше не сможете его называть. Если вы не поставите точку с запятой, функция все равно может быть выполнена. - person SolutionYogi; 17.07.2009
comment
Я думал, что автоматическая вставка точки с запятой в этом случае поставит точку с запятой, но это не так. Значит ты прав. - person Nosredna; 17.07.2009
comment
Nosredna, JS ведет себя мало произвольно, когда дело доходит до добавления точек с запятой. Прочтите эту подробную статью: blog.boyet.com/ блог / javascriptlessons / - person SolutionYogi; 17.07.2009
comment
Да, я вижу это (function (msg) {alert (msg)}) ('SO'); работает. Я просто спрашивал, почему это работает. Где это указано или что это за функция JS. Итак, как только я позвоню: (function (msg) {alert (msg)}), что произойдет с функцией? Будет GC'ed? - person palig; 17.07.2009
comment
Я хотел бы думать, что он будет GCed, когда браузер решит. Но вы теряете возможность использовать эту функцию. - person SolutionYogi; 17.07.2009
comment
palig, я обновил свой ответ, добавив более подробную информацию о функции JS. Надеюсь, это поможет. - person SolutionYogi; 17.07.2009
comment
alert(typeof test1); //alerts 'test1' Нет, это не так. typeof test1 == "function" - person Justin Johnson; 17.07.2009
comment
Это опечатка, исправлю. Надеюсь, вы уловили главное сообщение. :) - person SolutionYogi; 17.07.2009
comment
Хорошо, отличное обновление! Вот теперь все, что мне нужно знать в одном месте. Большое спасибо! - person palig; 17.07.2009
comment
Я могу ошибаться, но я почти уверен, что IE также рассматривает именованные выражения функций как объявления функций, поэтому вы можете вызывать функцию по имени вне самой функции. Итак, в вашем примере mySum будет определен даже вне функционального блока. Я не уверен в этом, но в любом случае в IE есть некоторые странные ошибки с объявлениями функций. :) - person Sasha Chedygov; 05.06.2010
comment
Дуглас Крокфорд часто указывает на неверно интерпретируемые ситуации, которые можно непреднамеренно создать, не используя точки с запятой. Лично я считаю, что лучше всего использовать их постоянно - это проще, чем вспоминать времена, когда это действительно важно, и просто вставлять их потом. Согласно правилам кода Крокфорда: поместите; (точка с запятой) в конце каждого простого оператора .... JavaScript позволяет использовать любое выражение в качестве оператора. Это может замаскировать некоторые ошибки, особенно при наличии [неявной] точки с запятой. - person hotshot309; 06.01.2012
comment
А что насчет alert(function(a,b) {return a+b;})? Что это за функция и как бы вы вводили a и b? Я много раз видел это в jQuery, например $('.class').addClass(function() {return 'asdf';}); - person chharvey; 24.07.2013
comment
Есть еще один способ вызвать анонимную функцию: (function (msg) {alert (msg);} ('SO')); // предупреждает SO. - person Oleksandr_DJ; 05.09.2013
comment
@chharvey: передача выражения функции в alert не имеет большого значения. Но в случае с jQuery есть много ситуаций, когда это полезно. Ваш пример с addClass не имеет для меня особого смысла, но функция on принимает слушателя, который является функцией обратного вызова. on "знает", что получит функцию, и вызовет ее в нужный момент. Функции обратного вызова в основном используются для асинхронных действий (например, запроса ajax) или для обработки событий. - person Stijn de Witt; 18.05.2014
comment
@SolutionYogi Большое спасибо! Я тоже некоторое время задавался этим вопросом, будучи начинающим программистом, и теперь это имеет смысл! - person Jonathan Lam; 09.07.2014

Это называется автоматически запускаемой функцией.

Когда вы вызываете (function(){}), вы возвращаете объект функции. Когда вы добавляете к нему (), он вызывается, и все, что находится в теле, выполняется. ; обозначает конец оператора, поэтому второй вызов не выполняется.

person seth    schedule 16.07.2009
comment
А, хорошо, понятно, так что это просто какой-то особый синтаксис JS, верно? Больше всего нравится это объяснение! Просто и коротко :) - person palig; 17.07.2009
comment
Я считаю, что говорить о том, что тело будет «обжаловано», некорректно. Он выполняется так же, как и любая другая функция. Поскольку это анонимно, вы либо сохраните ссылку где-нибудь, либо выполните ее сразу. - person SolutionYogi; 17.07.2009
comment
Лично мне даже не нравится термин «самозапускающаяся функция». Дело не в том, что функция вызывает сама себя. Программист написал эти скобки, чтобы вызвать его. - person SolutionYogi; 17.07.2009
comment
Это не особый синтаксис, больше, чем что-либо особенное. На самом деле форма имени функции (args) {BLOCK} гораздо более особенная. На самом деле это ненужный сахар; это то, что на самом деле заставляет вещи происходить. - person jrockway; 17.07.2009
comment
jrockway, почему этот другой блок кода особенный? Хотите уточнить? - person SolutionYogi; 17.07.2009
comment
Ссылка, указанная в ответе, не работает. - person I. J. Kennedy; 05.01.2013
comment
Также вы можете передать функцию в самозапускающуюся функцию, это действительно удобно, а не только переменные аргументы. The; сообщает JS, что выполнить (завершить) анонимную функцию. - person Felix; 22.08.2013
comment
хорошая ссылка на статью. В нем отмечается, почему кто-то может использовать эту цитату: чтобы защитить глобальный объект, все приложения JavaScript должны быть написаны внутри самозапускающейся функции. Это создаст область приложения, в которой можно создавать переменные, не опасаясь их столкновения с другими приложениями. Также отмечено, что после завершения функции переменные удаляются, а глобальный объект остается неизменным. - person yeahdixon; 13.09.2013
comment
Это отличный ответ, который помог мне понять анонимные функции после нескольких сообщений SO. - person Anupam; 19.12.2017

Одна вещь, которая меня смутила, - это то, что «()» - это операторы группировки.

Вот ваша основная заявленная функция.

Ex. 1:

var message = 'SO';

function foo(msg) {
    alert(msg);
}

foo(message);

Функции являются объектами и могут быть сгруппированы. Итак, давайте обведем функцию скобками.

Ex. 2:

var message = 'SO';

function foo(msg) {  //declares foo
    alert(msg);
}

(foo)(message);     // calls foo

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

Ex. 3.

var message = 'SO';

(function foo(msg) {
    alert(msg);
})(message);          // declares & calls foo

Наконец, нам не нужен этот дополнительный foo, потому что мы не используем имя для его вызова! Функции могут быть анонимными.

Ex. 4.

var message = 'SO';

(function (msg) {   // remove unnecessary reference to foo
    alert(msg);
})(message);

Чтобы ответить на ваш вопрос, вернитесь к примеру 2. Первая строка объявляет некоторую безымянную функцию и группирует ее, но не вызывает ее. Вторая строка группирует строку. Оба ничего не делают. (Первый пример Винсента.)

(function (msg){alert(msg)});  
('SO');                       // nothing.

(foo); 
(msg); //Still nothing.

Но

(foo)
(msg); //works
person Benxamin    schedule 20.04.2011
comment
Спасибо. Ваши примеры были достаточно ясными. Я не знал, что круглые скобки в JavaScript могут таким образом изменить смысл кода. У меня есть опыт работы с Java, поэтому я узнаю что-то новое (и часто неожиданное) о JavaScript почти каждый день, когда использую его. - person hotshot309; 21.07.2011
comment
Спасибо, что сделали это шаг за шагом, это намного лучше, чем любое другое объяснение, которое я видел. +1 - person Wk_of_Angmar; 25.12.2012
comment
Важный момент AHA здесь - и спасибо за иллюстрацию с заменой. +100 - person FredTheWebGuy; 07.09.2013
comment
Одно из лучших объяснений анонимных функций, которые я когда-либо читал. Большое спасибо! - person Teknotica; 09.08.2014

Анонимная функция не является функцией с именем "". Это просто функция без имени.

Как и любое другое значение в JavaScript, для создания функции не требуется имя. Хотя гораздо полезнее привязать его к имени, как и к любому другому значению.

Но, как и любое другое значение, вы иногда хотите использовать его без привязки к имени. Это самозапускающийся шаблон.

Вот функция и число, не связанные, они ничего не делают и никогда не могут быть использованы:

function(){ alert("plop"); }
2;

Поэтому мы должны сохранить их в переменной, чтобы иметь возможность использовать их, как и любое другое значение:

var f = function(){ alert("plop"); }
var n = 2;

Вы также можете использовать синтаксический сахар для привязки функции к переменной:

function f(){ alert("plop"); }
var n = 2;

Но если их именование не требуется и приведет к еще большей путанице и меньшей удобочитаемости, вы можете просто использовать их прямо сейчас.

(function(){ alert("plop"); })(); // will display "plop"
alert(2 + 3); // will display 5

Здесь моя функция и мои числа не привязаны к переменной, но их все равно можно использовать.

Сказано так, похоже, что самозапускающаяся функция не имеет реальной ценности. Но вы должны помнить, что разделителем области видимости JavaScript является функция, а не блок ({}).

Таким образом, самозапускающаяся функция фактически имеет то же значение, что и блок C ++, C # или Java. Это означает, что переменная, созданная внутри, не будет «просачиваться» за пределы области видимости. Это очень полезно в JavaScript, чтобы не загрязнять глобальную область видимости.

person Vincent Robert    schedule 16.07.2009
comment
Хороший пост. Что тогда произойдет с функцией 'function () {alert (plop); } 'когда я его выполнил? Будет GC'ed? - person palig; 17.07.2009
comment
Функция () {предупреждение (шлеп); } инструкция просто выделяет функцию, но не выполняет ее и не привязывает к переменной. Поскольку созданная функция не привязана к какой-либо переменной, она будет быстро собрана в сборку мусора. - person Vincent Robert; 17.07.2009
comment
Этот поток SO выходит за рамки того, о чем мы говорим здесь, но он объясняет способы разделения Пространства имен JavaScript - и включает примеры, в которых используются самозапускающиеся функции. - person hotshot309; 21.07.2011

Так работает JavaScript. Вы можете объявить именованную функцию:

function foo(msg){
   alert(msg);
}

И назовите это:

foo("Hi!");

Или вы можете объявить анонимную функцию:

var foo = function (msg) {
    alert(msg);
}

И назовите это:

foo("Hi!");

Или вы просто никогда не можете привязать функцию к имени:

(function(msg){
   alert(msg);
 })("Hi!");

Функции также могут возвращать функции:

function make_foo() {
    return function(msg){ alert(msg) };
}

(make_foo())("Hi!");

Ничего не стоит, что любые переменные, определенные с помощью "var" в теле make_foo, будут закрыты каждой функцией, возвращаемой make_foo. Это закрытие, и это означает, что любое изменение значения, сделанное одной функцией, будет видно другой.

Это позволяет вам инкапсулировать информацию, если вы хотите:

function make_greeter(msg){
    return function() { alert(msg) };
}

var hello = make_greeter("Hello!");

hello();

Так работает почти любой язык программирования, кроме Java.

person jrockway    schedule 16.07.2009

Код, который вы показываете,

(function (msg){alert(msg)});
('SO');

состоят из двух операторов. Первое - это выражение, которое возвращает объект функции (который затем будет собираться сборщиком мусора, потому что он не сохраняется). Второй - это выражение, которое возвращает строку. Чтобы применить функцию к строке, вам нужно либо передать строку в качестве аргумента функции при ее создании (что также показано выше), либо вам нужно будет фактически сохранить функцию в переменной, чтобы вы могли примените его позже, на досуге. Вот так:

var f = (function (msg){alert(msg)});
f('SO');

Обратите внимание, что, сохраняя анонимную функцию (лямбда-функцию) в переменной, вы фактически даете ей имя. Следовательно, вы можете также определить обычную функцию:

function f(msg) {alert(msg)};
f('SO');
person Stephan202    schedule 16.07.2009

Резюмируя предыдущие комментарии:

function() {
  alert("hello");
}();

если не присвоено переменной, выдает синтаксическую ошибку. Код анализируется как оператор (или определение) функции, что делает закрывающие круглые скобки синтаксически неверными. Добавление круглых скобок вокруг функциональной части сообщает интерпретатору (и программисту), что это выражение функции (или вызов), как в

(function() {
  alert("hello");
})();

Это самозапускающаяся функция, то есть она создается анонимно и запускается немедленно, потому что вызов происходит в той же строке, где он объявлен. Эта самозапускающаяся функция обозначается знакомым синтаксисом для вызова функции без аргументов, плюс добавлены круглые скобки вокруг имени функции: (myFunction)();.

Существует хороший синтаксис функции JavaScript для обсуждения SO < / а>.

person hotshot309    schedule 29.12.2011

Этот ответ не имеет прямого отношения к вопросу, но вам может быть интересно узнать, что такая синтаксическая функция не является специфической для функций. Например, мы всегда можем сделать что-то вроде этого:

alert(
    {foo: "I am foo", bar: "I am bar"}.foo
); // alerts "I am foo"

Относится к функциям. Поскольку они являются объектами, которые наследуются от Function.prototype, мы можем делать такие вещи, как:

Function.prototype.foo = function () {
    return function () {
        alert("foo");
    };
};

var bar = (function () {}).foo();

bar(); // alerts foo

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

var x = function () {} (); // this function is executed but does nothing

function () {} (); // syntax error

Еще одна вещь, которую вы можете сделать с функциями, как только вы их объявите, - это вызвать над ними оператор new и получить объект. Следующие варианты эквивалентны:

var obj = new function () {
    this.foo = "bar";
};

var obj = {
    foo : "bar"
};
person Ionuț G. Stan    schedule 16.07.2009

Есть еще одно свойство, которое имеет функция JavaScript. Если вы хотите рекурсивно вызывать ту же анонимную функцию.

(function forInternalOnly(){

  //you can use forInternalOnly to call this anonymous function
  /// forInternalOnly can be used inside function only, like
  var result = forInternalOnly();
})();

//this will not work
forInternalOnly();// no such a method exist
person Anoop    schedule 17.10.2011
comment
+1 Добавил небольшую выборку, чтобы было понятнее :-) При первом чтении пришлось 4 раза перечитывать. - person xanatos; 17.10.2011

Мое понимание вопроса задающего вопрос таково, что:

Как работает эта магия:

(function(){}) ('input')   // Used in his example

Я могу ошибаться. Однако обычная практика, с которой люди знакомы, такова:

(function(){}('input') )

Причина в том, что скобки JavaScript AKA () не могут содержать операторов, и когда синтаксический анализатор встречает ключевое слово функции, он знает, что нужно анализировать его как выражение функции, а не как объявление функции.

Источник: сообщение в блоге Immediately-Invoked Function Expression (IIFE)

person laycat    schedule 01.05.2013

примеры без скобок:

void function (msg) { alert(msg); }
('SO');

(это единственное реальное использование void, afaik)

or

var a = function (msg) { alert(msg); }
('SO');

or

!function (msg) { alert(msg); }
('SO');

тоже работать. void вызывает оценку выражения, а также присваивание и взрыв. последний работает с ~, +, -, delete, typeof, некоторыми унарными операторами (void также является одним). не работают из-за ++, -- из-за требования переменной.

разрыв строки не нужен.

person Nina Scholz    schedule 23.04.2015
comment
@Bergi на ie11 delete работает. даже с 'use strict';. это тоже работает: delete (3 + 4); - person Nina Scholz; 23.04.2015
comment
Ой, моя ошибка. 2) Если Тип (ссылка) не является ссылкой, вернуть истину. Он выдает ошибки только для фактических неразрешимых ссылок. - person Bergi; 23.04.2015

Это самоисполняющаяся анонимная функция. Первый набор скобок содержит выражения, которые должны быть выполнены, а второй набор скобок выполняет эти выражения.

(function () {
    return ( 10 + 20 );
})();

Питер Мишо обсуждает разницу в важной паре круглых скобок.

Это полезная конструкция при попытке скрыть переменные из родительского пространства имен. Весь код внутри функции содержится в закрытой области видимости функции, то есть к нему вообще нельзя получить доступ извне функции, что делает его действительно закрытым.

Видеть:

  1. Closure (информатика)
  2. Пространство имен JavaScript
  3. Важная пара круглых скобок Javascript
person Ashwin Parmar    schedule 11.10.2013

Другая точка зрения

Во-первых, вы можете объявить анонимную функцию:

var foo = function(msg){
 alert(msg);
}

Тогда вы называете это:

foo ('Few');

Поскольку foo = function (msg) {alert (msg);}, вы можете заменить foo как:

function(msg){
 alert(msg);
} ('Few');

Но вы должны заключить всю анонимную функцию в пару фигурных скобок, чтобы избежать синтаксической ошибки объявления функции при синтаксическом анализе. Тогда у нас есть

(function(msg){
 alert(msg);
}) ('Few');

Таким образом, для меня это легко понять.

person capu    schedule 21.06.2013

Когда вы это сделали:

(function (msg){alert(msg)});
('SO');

Вы завершили функцию перед ('SO') из-за точки с запятой. Если просто написать:

(function (msg){alert(msg)})
('SO');

Это будет работать.

Рабочий пример: http://jsfiddle.net/oliverni/dbVjg/

person Oliver Ni    schedule 29.11.2013

Простая причина, по которой это не работает, заключается не в том, что ; указывает на конец анонимной функции. Это потому, что без () в конце вызова функции это не вызов функции. То есть,

function help() {return true;}

Если вы вызываете result = help();, это вызов функции, которая вернет истину.

Если вы звоните result = help;, это не звонок. Это задание, в котором справка рассматривается как данные, которые необходимо присвоить результату.

Что вы сделали, так это объявили / инстанциировали анонимную функцию, добавив точку с запятой,

(function (msg) { /* Code here */ });

а затем попытался вызвать его в другом операторе, используя только круглые скобки ... Очевидно, потому что функция не имеет имени, но это не сработает:

('SO');

Интерпретатор видит круглые скобки во второй строке как новую инструкцию / оператор, и поэтому он не работает, даже если вы сделали это следующим образом:

(function (msg){/*code here*/});('SO');

Он по-прежнему не работает, но работает, когда вы удаляете точку с запятой, потому что интерпретатор игнорирует пробелы и каретки и видит весь код как один оператор.

(function (msg){/*code here*/})        // This space is ignored by the interpreter
('SO');

Заключение: вызов функции не является вызовом функции без () на конце, если только при определенных условиях, таких как вызов другой функции, то есть onload = 'help' будет выполнять функцию справки, даже если круглые скобки не были включены. Я считаю, что setTimeout и setInterval также допускают этот тип вызова функции, и я также считаю, что интерпретатор в любом случае добавляет круглые скобки за кулисами, что возвращает нас к «вызов функции не является вызовом функции без круглых скобок».

person hired techniques    schedule 12.10.2013
comment
Я не понимаю, почему это получило так много голосов против. Думаю, это приемлемый ответ? : / - person Daniel Cheung; 03.07.2015

(function (msg){alert(msg)})
('SO');

Это распространенный метод использования анонимной функции в качестве закрытия, который используют многие фреймворки JavaScript.

Эта функция вызывается автоматически при компиляции кода.

Если поместить ; в первую строку, компилятор рассматривает ее как две разные строки. Таким образом, вы не можете получить те же результаты, что и выше.

Это также можно записать как:

(function (msg){alert(msg)}('SO'));

Дополнительные сведения см. В JavaScript / анонимные функции.

person user2349539    schedule 06.12.2013
comment
Насколько мне известно, JavaScript не компилируется - person Daniel Cheung; 03.07.2015

  1. Анонимные функции - это функции, которые динамически объявляются во время выполнения. Они называются анонимными функциями, потому что им не дается имя, как обычным функциям.

    Анонимные функции объявляются с использованием оператора функции вместо объявления функции. Вы можете использовать оператор функции для создания новой функции везде, где допустимо поместить выражение. Например, вы можете объявить новую функцию как параметр для вызова функции или присвоить свойство другому объекту.

    Вот типичный пример именованной функции:

    функция flyToTheMoon () {alert ("Масштаб! Масштаб! Масштаб!"); } flyToTheMoon (); Вот тот же пример, созданный как анонимная функция:

    var flyToTheMoon = function () {alert ("Масштаб! Масштаб! Масштаб!"); } flyToTheMoon ();

    Подробности читайте здесь:

    http://helephant.com/2008/08/23/javascript-anonymous-functions/

person Harikesh Yadav    schedule 12.10.2015

IIFE просто разделяет функцию и скрывает переменную msg, чтобы не «загрязнять» глобальное пространство имен. На самом деле, просто сохраняйте простоту и делайте, как показано ниже, если только вы не создаете веб-сайт на миллиард долларов.

var msg = "later dude";
window.onunload = function(msg){
  alert( msg );
};

Вы можете создать пространство имен для своего msg свойства, используя шаблон модуля выявления, например:

var myScript = (function() {
    var pub = {};
    //myscript.msg
    pub.msg = "later dude";
    window.onunload = function(msg) {
        alert(msg);
    };
    //API
    return pub;
}());
person Ronnie Royston    schedule 12.10.2017

Анонимные функции предназначены для одноразового использования, когда вы определяете функцию на лету, чтобы она генерировала вывод от вас из вводимых вами данных. За исключением того, что вы не предоставили ввод. Вместо этого вы написали что-то во второй строке («SO»); - независимое утверждение, не имеющее отношения к функции. Что вы ожидали? :)

person Vietnhi Phuvan    schedule 23.04.2013
comment
Не на 100% правильно. Это также анонимная функция, которую можно использовать повторно: var foo = function() {};. А в остальном все в порядке. - person Felix Kling; 24.04.2013