Mam w kodzie zmienne globalne, m.in var exitStatus = 0; Chciałem, aby każdy podobiekt (np. checkAccountStatus) zmieniał wartość tej zmiennej z 0 na 1.
var exitStatus = 0; // zmienna globalna
var accountMenu = function()
{
exitStatus = 0; // zmienna lokalna
};
var subMenus = {
checkAccountStatus: { // podobiekt
exitStatus: 1 // Nie mogę tu zapisać this.exitStatus: 1,
// bo WeBstorm podkreśla jako błąd składni
}
};
Problem pojawił się po tym, gdy zauważyłem, że gdy w podobiektach wpiszę exitStatus = 1; to jest ona traktowana jako zmienna lokalna (nawet WebStorm inaczej ją koloruje) i w konsoli widzę, że wartość exitStatus jest 0 (czyli się nie zmieniła względem globalnej), natomiast wartość this.exitStatus (dla podobiektu checkAccountStatus) w konsoli widoczna jest jako 'undefined'. W sumie logiczne, bo skoro w podobiekcie utworzyłem zmienną lokalną exitStatus = 1 (a WebStorm mi to potwierdził kolorem), wobec tego nie zmienia ona wartości zmiennej globalnej (która wciąż ma 0).
Próbowałem więc w podobiekcie wpisać this.exitStatus = 1 (żeby odnosiła się do globalnego kontekstu, czyli zmiennej globalnej), no i zorientowałęm się, że w "Object Literal Notation" (nie wiem jak to dosłownie przetłumaczyć, ale jest to jeden z dwóch sposobów tworzenia obiektów), nie mogę przypisywać this. do zmiennych, jak to ma miejsce podczas tworzenia obiektów za pomocą konstruktorów, np.
function checkAccountStatus(exitStatus){
this.exitStatus = exitStatus;
};
Zapisałem wobec tego w ten sposób:
var subMenus = {
checkAccountStatus: {
show: function(){
exitStatus = 1;
}
}
};
Oczywiście, aby dokopać się do funkcji show(), muszę ją wywołać poprzez subMenus.showAccountStatus.show();, ale chodzi mi o dwie rzeczy.
1. Dlaczego w zapisie "notacyjnym" nie mogę dopisać this. do zmiennej, tylko muszę stworzyć funkcję, w której dopiero mogę tak zapisać?
2. Dlaczego exitStatus = 1 wewnątrz podobiektu checkAccountStatus jest traktowany jako zmienna lokalna, a wewnątrz funkcji tego podobiektu już jako zmienna globalna? Natomiast, gdy w funkcji tego podobiektu zapiszę this.exitStatus = 1 to wtedy zmienna ta odnosi się do podobiektu i jest znowu lokalna?