Przyczyna tego wywołania funkcji anonimowej

Przeglądając kod na GitHubie znalazłem:

(function() {

}).call(this);

Jest to ewidentnie funkcja anonimowa. Ale dlaczego jest to napisane w ten sposób? Przyzwyczaiłem się do kanonicznego wariantu (function() {})().

Czy jest jakaś szczególna korzyść w używaniu .call(this) do samodzielnego wywoływania funkcji anonimowych?


Edit: wygląda na to, że niektóre środowiska commonjs ustawiają this na nie-globalną wartość na najwyższym poziomie modułu. Które i co ustawiają this na to może chcesz zachować?

Author: Sean McMillan, 2011-06-09

5 answers

.call(this) (w rzeczywistości tylko () dopóki go nie zmieniłem) zapewnia spójność najwyższego poziomu this poprzez tryb ścisły, opcję --bare i/lub środowisko uruchomieniowe (gdzie najwyższy poziom {[2] }nie wskazuje na obiekt globalny).

 5
Author: matyr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 09:19:11

Domyślnie wywołanie funkcji takiej jak (function(){/*...*/})() ustawi wartość this w funkcji na window (w przeglądarce), niezależnie od tego, jaka wartość this może znajdować się w kontekście, w którym funkcja została utworzona.

Użycie call Pozwala ręcznie ustawić wartość this na dowolną. W tym przypadku ustawia ją na dowolną wartość this w kontekście zamykającym.

Weź to przykład:

var obj = {
    foo:'bar'
};

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

Http://jsfiddle.net/LWFAp/

Widać, że udało nam się ręcznie ustawić wartość this do obiektu, do którego odnosi się zmienna obj.

 26
Author: user113716,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 02:52:32

Za pomocą:

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

Następnie Ten w zakresie kodu (prawdopodobnie obiekt globalny) jest ustawiany jako Ten obiekt funkcji. Z tego co wiem to jest równoważne:

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

W przeglądarce, zazwyczaj window jest (lub zachowuje się tak, jakby był) aliasem dla obiektu globalnego.

 0
Author: RobG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 02:53:12
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); może ustawić this w anonymous na kontekst wywołujący this, w powyższym jest C.(function() {})(); Ustawia this na window lub undefined w zależności od trybu.

 0
Author: linjie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-27 08:00:24

Funkcja samo wywołująca jest przydatna do wykonania jej zawartości natychmiast po załadowaniu skryptu. Jest to wygodne do inicjalizacji elementów globalnego zakresu.

 -3
Author: Freeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-10 15:00:38