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

Причина этого самоисключения анонимного варианта функции

При просмотре кода в github я нашел следующее:

(function() {

}).call(this);

Это явно самоисключение анонимной функции. Но почему это написано так? Я привык видеть канонический вариант (function() {})().

Есть ли какое-то особое преимущество при использовании .call(this) для самоназывающей анонимной функции?


Изменить: похоже, некоторые среды commonjs устанавливают this на неглобальное значение на верхнем уровне модуля. Какие из них, и что они установили this, чтобы вы могли сохранить?

4b9b3361

Ответ 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. Это удобно для инициализации элементов глобальной области.