Kontekst wywołania funkcji
Każda funkcja w JavaScript posiada dwa obiekty z nią skojarzone:
- this – kontekst wywołania
- arguments – (array-like object) lista argumentów przekazanych przy wywołaniu
Zobaczmy, jak wyglada to w praktyce:
function example1() { console.log('this: ', this, ', arguments: ', arguments); } example1();
Fragmenty kodu umieszczone w tym artykułe można uruchamiać w konsoli przeglądarki. Konsola ta najczęściej dostępna jest po wcisnięciu F12.
W wyniku wywołania funkcji `example1’ otrzymamy w konsoli:
this: Window, arguments: []
Jak widać przy wywołaniu takiej funkcji bez parametrów `this’ przyjmuje wartość obiektu globalnego `window’, natomiast `arguments’ jest pustą listą.
Może właśnie zapytałeś: “Jeśli `this’ === `windows’, to czy zmienne globalne są właściwościami obiektu `window’?”
Sprawdźmy:
function example2() { window.console.log(this===window); } window.example2();
W wyniku wywołania funkcji `window.example2’ otrzymamy: `true’. Zatem – tak, zmienne globalne w skryptach uruchamianych w przeglądarce są właściwościami obiektu globalnego `window’. Domyślnym kontekstem dla skryptów uruchamianych w normalnym trybie w przeglądarkach jest właśnie `window’. Sprawę trochę zmienia (porządkuje) tryb ścisły, o którym nie będę pisał w tym poście. Jest to temat na osobny artykuł.
Operator `new’
Skoro już wiemy, że domyślnie `this’ wskazuje na obiekt globalny, to co należy zrobić, aby powiąząć `this’ z aktualnym obiektem?
rozwiązanie 1:
var obj = { x : 'jestem wartością obj.x', test : function() { console.log(this.x); } }; obj.test(); // w konsoli pokaże się "jestem wartością obj.x"
rozwiązanie 2:
function Constructor() { this.x = 'jestem wartością Constructor.x'; this.test = function() { console.log(this.x); } }; (new Constructor()).test(); // w konsoli pokaże się "jestem wartością Constructor.x"
W obu przypadkach zarówno pole `x’, jak i pole `test’ (będące referencją na funkcję) są publiczne. Można odwołać się:
obj.x; (new Constructor()).x;
lub nawet nadpisać te wartości. JavaScript pozwala na to. Najczęściej jednak NIE należy tego robić.
autor : Wojciech Buczek