bo wywołujesz ją w kontekście konkretnego obiektu (poprzez instancjaObiektu.nazwaFunkcji()
)
zobacz taki przykład:
function MyObject() {
this.x = 10;
this.start = function bbb() {
alert(this.x);
};
};
obj = new MyObject();
obj.start(); // pojawi się 10
funkcja = obj.start;
funkcja(); // pojawi się undefined (funkcja nie jest wywołana w kontekście obiektu "obj")
btw - funkcja nie nazywa się wcale "bbb" tylko "start" - to "bbb" tam jest zbędne
a żeby rozwiązać Twój problem masz co najmniej 3 wyjścia:
function MyObject() {
this.x = 10;
var that = this; // ZAPAMIĘTANIE OBECNEGO `THIS` W `THAT`
this.start = function bbb() {
(function() {
alert(that.x); // pojawi sie 10
})();
alert(that.x); // pojawi sie 10 (w tym miejscu PRAWIE obojętne jest czy użyjesz `this` czy `that`)
};
};
obj = new MyObject();
obj.start();
(połącz poprzedni przykład z tym żeby się dowiedzieć co mam na myśli pisząc "PRAWIE")
ewentualnie:
function MyObject() {
this.x = 10;
this.start = function bbb() {
(function() {
alert(this.x); // pojawi sie 10
}).call(this); // TU ZMIANA - WYWOŁANIE W KONTEKŚCIE OBECNEGO `THIS`
alert(this.x); // pojawi sie 10
};
};
obj = new MyObject();
obj.start();
albo po prostu:
function MyObject() {
this.x = 10;
this.foo = function()
{
alert(this.x); // pojawi sie 10
};
this.start = function bbb() {
this.foo(); // zwykłe wywołanie bez zmiany kontekstu - jeżeli możesz użyj tego rozwiązania
alert(this.x); // pojawi sie 10
};
};
obj = new MyObject();
obj.start();
BTW - @Shalom Cię trochę okłamał - w anonimowej funkcji "this" nie jest tą funkcją tylko obiektem "window"