Причина, по которой этот пользователь вызывает анонимный вариант функции - PullRequest
24 голосов
/ 09 июня 2011

Глядя на код на github, я обнаружил следующее:

(function() {

}).call(this);

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

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


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

Ответы [ 5 ]

26 голосов
/ 09 июня 2011

По умолчанию при вызове такой функции, как (function(){/*...*/})(), значение this в функции будет установлено на window (в браузере), независимо от того, какое значение this может находиться в окружающем контексте, гдеФункция была создана.

Использование call позволяет вручную установить значение this на любое значение.В этом случае он устанавливает его на любое значение this в окружающем контексте.

Возьмите этот пример:

var obj = {
    foo:'bar'
};

(function() {
    alert( this.foo ); // "bar"
}).call( obj );

http://jsfiddle.net/LWFAp/

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

5 голосов
/ 09 июня 2011

.call(this) (на самом деле было просто (), пока я его не изменил) обеспечивает согласованность вашего верхнего уровня this в строгом режиме, опции --bare и / или в рабочей среде (где верхний уровень this не зависит не указывать на глобальный объект).

0 голосов
/ 27 августа 2015
C={
    descript: "I'm C!<br>",
    F: function() {
        //set this to the caller context's 'this'
        (function() {
            document.write(this.descript);
        }).call(this);

        //set this to 'window' or 'undefined' depend the mode
        (function() {
            document.write(this.descript);
        })();

        //member function's '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 в зависимости от режима.

0 голосов
/ 10 июня 2012

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

0 голосов
/ 09 июня 2011

Используя:

> (function() {
>   ...
> }).call(this);`

, затем этот в области действия кода (вероятно, глобальный объект) устанавливается как этот объект функции.Насколько я могу судить, это эквивалентно:

(function(global) {
  // global references the object passed in as *this*
  // probably the global object
})(this);

В браузере обычно window является (или ведет себя так, как будто это) псевдоним для глобального объекта.

...