Problem z niewidocznością this

0
function MyObject() {
	this.x = 10;

	this.start = function bbb() {
		(function() {
			alert(this.x); // pojawi sie undefinied
		})();
	
		alert(this.x); // pojawi sie 10
	};
};

obj = new MyObject();
obj.start();

Chciałbym wiedzieć co powinienem zrobić, aby zamiast undefinied zobaczyć 10?

0

Proponuje napisać to poprawnie, wtedy będzie się wyświetlać to co chciałeś. Zauważ ze w miejscu w którym pojawia ci sie undefined this wskazuje na INNY obiekt! Bo przecież robisz to wewnątrz obiektu anonimowej funkcji i to ta funkcja jest w tym miejscu "thisem". Musisz do tej funkcji jakoś przekazać obiekt "nadrzędny" żeby móc się do niego odwołać.

0

A czemu funkcja bbb nie ma z thisem problemu? Przecież ta funkcja też jest tworzona i powinna mieć swój własny this, a nie nadrzędny?

1

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"

0

Dziękuje za pomoc.
Miłego dnia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1