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


