Зачем вам нужно вызывать анонимную функцию в той же строке? - PullRequest
368 голосов
/ 17 июля 2009

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

// 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)})

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

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

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

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

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

Ответы [ 19 ]

3 голосов
/ 17 октября 2011

Есть еще одно свойство, которое имеет функция 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
1 голос
/ 11 октября 2013

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

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

Питер Мишо обсуждает разницу в Важная пара скобок .

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

См:

  1. Закрытие (информатика)
  2. Пространство имен JavaScript
  3. Важная пара скобок Javascript
0 голосов
/ 06 декабря 2013
(function (msg){alert(msg)})
('SO');

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

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

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

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

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

Подробнее см. В JavaScript / анонимные функции .

0 голосов
/ 30 ноября 2013

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

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

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

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

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

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

0 голосов
/ 12 октября 2013

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

function help() {return true;}

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

Если вы звоните 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 также позволяют этот тип вызова функции, и я также полагаю, что интерпретатор в любом случае добавляет скобки за кулисы, что возвращает нас к «вызову функции не вызов функции без скобок».

0 голосов
/ 21 июня 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');

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

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

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

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

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

    var flyToTheMoon = function () {alert ("Zoom! Zoom! Zoom!"); } flyToTheMoon ();

    Подробнее см. Здесь:

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

0 голосов
/ 13 октября 2017

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;
}());
0 голосов
/ 23 апреля 2013

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

...