Подтвердить что ты не робот

Самовозбуждение анонимного выражения функции

(function(){ ... })();

Я посмотрел эту статью и немного понял об этом. Но есть несколько сомнений, в основном о том, как они используются.


Как статический блок!

так как он действует как статический блок (self invoking!), его можно использовать для инициализации (например, некоторые константы).

Но тогда нет getter, доступных для извлечения чего-либо из него и использования его в другом месте!


return, Must?

Решение, приведенное выше, состоит в том, чтобы иметь a return в этой функции? так что я могу получить все, что он возвращает, и использовать это.


ссылка на глобальный объект?!

(function(window, undefined){})(this);

Объяснение приведенного выше кода было во втором ответе ссылки , я не мог этого понять, если кто-нибудь может объяснить это больше (или проще для я), Это будет здорово


update: взгляните на этот код & darr;

var myElement=document.getElemetById("myElementId");
 (function(myElement){
      /**'this' here is 'myelement'???**/
 }; 
})(this);
4b9b3361

Ответ 1

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

var yourNamespace = (function(window, undefined){ 
                    /* private code:*/
                    var privateVar = "foobar",
                        count = 0;
                    /* the stuff you want to use outside: */
                    return{
                       val: 5,
                       publicVar:privateVar,
                       func:function(){return ++count}
                    }
             })(this);// `this` is a reference to `window` here

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

Одной из причин передачи undefined было то, что в ES3 undefined была доступна запись, что больше не имеет места в ES5. Передача поверх this в качестве параметра сокращает поиск путем создания прямой ссылки на глобальный объект window в области. Однако будьте очень осторожны - в строгом режиме ES5 this больше не окно, а разрешается undefined!! Так что это больше не рекомендуется!

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

if(myVar == undefined)
// could be compressed to:
if(a==x)

ИЗМЕНИТЬ свой вопрос:

this в вашем примере не изменится, вам нужно одно из следующих решений:

(function(myElement){/*your code*/})( document.getElemetById("myElementId") );
// or:
(function(){
    var myElement = document.getElemetById("myElementId");
    /* your code */ 
})();

Ответ 2

Основной темой iife является создание инкапсулированной области. В противном случае все переменные, которые вы объявляете, попадут в глобальную область.
Если вам нужно сделать что-то доступное из этой области видимости, вы можете явно создать глобальную переменную пространства имен, т.е. window.myApp = {} и прикрепить ее там, то есть window.myApp.myMethod = function(){...}
Причиной прохождения window в iife является то, что он создает локальную ссылку в пределах области. Это сократит цепочку поиска для лучшей производительности, и переменная также будет поддающейся проверке.


В ответ на ваш обновленный вопрос:

Чтобы создать локальный ref для элемента с использованием этого шаблона, вы должны предоставить его iif в качестве аргумента:

(function(element){

    element.style.top = "100px";

})(document.getElementById("myId"));

... но я не уверен, что существует большая ценность использования шаблона таким образом? В соответствии с моим комментарием ключевое слово this не затрагивается и будет по-прежнему указывать на window в этом примере.

Я думаю, что ключевое слово this вас сбивает с толку - это не обязательно относится к шаблону iife. Вот хорошее объяснение того, как определяется его значение: http://net.tutsplus.com/tutorials/javascript-ajax/fully-understanding-the-this-keyword/

Ответ 3

> его можно использовать для инициализации?... нет доступных геттеров для получения чего-либо от этого!

да, он часто используется для инициализации, и нет необходимости извлекать что-либо, если это возможно.

> Решение, приведенное выше, заключается в возврате?

нет, у него нет возврата, но он снова может это сделать. Если есть возврат, то он будет перенесен на любой... т.е.

var a = (function(){})();

a будет иметь возвращаемое значение или undefined.

(function(window, undefined){})(this);

параметр этот будет invoker - обычно это окно, но может быть любым объектом. если вы передадите это как параметр, он будет доступен через 1-й аргумент (окно в случае).

Надеюсь, что объяснения достаточно ясны.