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ć?
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).
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 );
Widać, że udało nam się ręcznie ustawić wartość this
do obiektu, do którego odnosi się zmienna obj
.
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.
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.
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.
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