Самовозбуждение анонимного выражения функции
(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);
Ответы
Ответ 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-й аргумент (окно в случае).
Надеюсь, что объяснения достаточно ясны.