Причина этого самоисключения анонимного варианта функции
При просмотре кода в github я нашел следующее:
(function() {
}).call(this);
Это явно самоисключение анонимной функции. Но почему это написано так? Я привык видеть канонический вариант (function() {})()
.
Есть ли какое-то особое преимущество при использовании .call(this)
для самоназывающей анонимной функции?
Изменить: похоже, некоторые среды commonjs устанавливают this
на неглобальное значение на верхнем уровне модуля. Какие из них, и что они установили this
, чтобы вы могли сохранить?
Ответы
Ответ 1
.call(this)
(на самом деле просто ()
, пока я его не изменил) гарантирует, что ваш верхний уровень this
будет согласован через строгий режим, --bare
и/или текущую среду (где верхний уровень this
doesn 't указывает на глобальный объект).
Ответ 2
По умолчанию вызов функции типа (function(){/*...*/})()
устанавливает значение this
в функции window
(в браузере) независимо от того, что значение this
может быть в окружении, где функция была создана.
Использование call
позволяет вам вручную установить значение this
на все, что вы хотите. В этом случае он устанавливает его в значение, которое имеет значение this
в окружении.
Возьмем этот пример:
var obj = {
foo:'bar'
};
(function() {
alert( this.foo ); // "bar"
}).call( obj );
http://jsfiddle.net/LWFAp/
Вы можете видеть, что нам удалось вручную установить значение this
для объекта, на который ссылается переменная obj
.
Ответ 3
Используя:
> (function() {
> ...
> }).call(this);`
то это в рамках кода (probaby global object) устанавливается как функция этого объекта. Насколько я могу судить, это эквивалентно:
(function(global) {
// global references the object passed in as *this*
// probably the global object
})(this);
В браузере обычно окно (или ведет себя так, как будто оно) является псевдонимом для глобального объекта.
Ответ 4
C={
descript: "I'm C!<br>",
F: function() {
//set this to the caller context 'this'
(function() {
document.write(this.descript);
}).call(this);
//set this to 'window' or 'undefined' depend the mode
(function() {
document.write(this.descript);
})();
//member function 'this' is the object self
document.write(this.descript);
}
}
window.descript="I'm window!<br>";
C.F();
(function() {}).call(this);
может установить this
в анонимный контекст вызывающего this
, выше - C
. (function() {})();
установит this
в window
или undefined
в зависимости от режима.
Ответ 5
Функция самозапуска полезна для выполнения ее содержимого сразу же после загрузки script. Это удобно для инициализации элементов глобальной области.