Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкание + конструктор + событие (https://javascript.ru/forum/misc/30247-zamykanie-konstruktor-sobytie.html)

Вовочка 28.07.2012 23:40

Замыкание + конструктор + событие
 
Вот замыкает меня на замыканиях ничего не могу поделать. Помогите. Очень много читал про замыкания, не доходит до меня и всё.

Как получить в функции-обработчике события (this.getImdt) какое либо свойства из конструктора (this.ctx)

function Constr(ctx) {
	this.ctx = ctx;
	this.loadImg = function() {
		var img = new Image();
		img.src = "http://webstorm/densitometr/Densitometr/img/Pan.jpg";
		img.onload = this.getImdt;
	};
	this.getImdt = function(x,y){
		alert(ctx); // нужно получить this.ctx 
	};
}
var ctx = "something text";
var obj = new Constr(ctx);


Благодарю

Dim@ 28.07.2012 23:51

просто пиши this.ctx :
function Constr(ctx) {
	this.ctx = ctx;
	this.getImdt = function(x,y){
		alert(this.ctx); // нужно получить this.ctx 
	};
        
}
var ctx = "something text";
var obj = new Constr(ctx);
obj.getImdt();

dmitriymar 28.07.2012 23:57

Вовочка,
Мухи отдельно, котлеты отдельно.
http://javascript.ru/tutorial/object/thiskeyword

vadim5june 28.07.2012 23:57

так попробуйте
function Constr(ctx) {
var t=this;
.....
this.getImdt = function(x,y){
        alert(t.ctx);...

Вовочка 29.07.2012 00:00

Dim@, dmitriymar,

img.onload - событие, получающее объект event вместо this

мне не нужно event.ctx, мне нужно obj.ctx

zebra 29.07.2012 00:03

function Constr(ctx) {
        var self = this;
	this.ctx = ctx;
	this.loadImg = function() {
		var img = new Image();
		img.src = "http://webstorm/densitometr/Densitometr/img/Pan.jpg";
		img.onload = self .getImdt;
	};
	this.getImdt = function(x,y){
		alert(ctx); // нужно получить this.ctx 
	};
}
var ctx = "something text";
var obj = new Constr(ctx);

melky 29.07.2012 00:06

так как при назначении обработчиков теряется this, то можно его залочить с помощью bind :
(если я правильно понял)
img.onload = this.getImdt.bind(this);

пример :
<script>
function Constr(ctx) {
	this.ctx = ctx;
	this.loadImg = function() {
		var img = new Image();
		img.src = "http://javascript.ru/forum/images/smilies/lol.gif";
		img.onload = this.getImdt.bind(this);
	};
	this.getImdt = function(x,y){
		alert(this.ctx); // нужно получить this.ctx 
	};
}
var ctx = "something text";
var obj = new Constr(ctx);
obj.loadImg();
</script>

zebra 29.07.2012 00:12

О да, что-то я не то написал. В ообщем как написал melky через bind, либо определить выше переменную, которая будет ссылаться на this

Вовочка 29.07.2012 00:13

vadim5june, zebra

Благодарю, понял, сижу переосмысливаю.

melky, вот это решение даже не ожидал, благодарю, пойду почитаю про bind.


зы: получается, что в двух решениях задачи, замыкания не используются?)


Часовой пояс GMT +3, время: 07:45.