JS. Область видимости свойств объекта в методе-обработчике события объекта html-докум

Alex_aka_SkyNet

Новичок
JS. Область видимости свойств объекта в методе-обработчике события объекта html-докум

мои приветствия, уважаемые!

не могу похвастатья исключительными знаниями в области JS, однако имею приличный опыт его использования в корыстных целях ;)

и вот, набрел на интересную ситуацию, разрешить которую мешает наверняка отсутствие некоторых базовых пониманий...

итак, ситуация:

имеем - html с объектом (скажем, тег button), JS-объект

цель - заставить объект JS подставить в качестве обработчика события (ONCLICK) button'а, один из своих методов, с тем чтобы продолжить работу со свойствами объекта JS.

PHP:
<button id='myButton'>myButton</button>
<script>
function myObject() {
	this.myvar='aaa'; //искомое свойство
	this.obj=document.getElementById('myButton'); //объект html
	this.f1=function() this.obj.onclick=this.f2; //этот метод, при вызове, должен 
//присвоить обработчик событию ONCKICK объекта this.obj
	this.f2=function () alert(this.myvar); //при событии хотим видеть свойство объекта
}

var myNewObject=new myObject();
myNewObject.f1(); //кликаем на button, результат = undefined

</script>
неужели, при вызове метода в качестве обработчика события, this перестает ссылаться на объект myNewObject ?

заранее благодарю
 

Scud

Новичок
В JS this устанавливается для метода в момент вызова метода, поэтому при вызове myButton.onclick в this будет ссылка на myButton, а не на экземпляр myObject. Для того чтобы в обработчике f2 иметь ссылку на myObject нужно воспользоваться замыканием (closure).
 

@ndrey

Новичок
а к чему такой изврат? неужели нельзя обойтись <button id='myButton' onClick='myFunction()'>myButton</button> ?
 

Alex_aka_SkyNet

Новичок
Scud, благодарствую!

что ж, мои опасения оправдались)
нет ли полезных ссылок на почитать про замыкания, да и вообще полезные ссылки по JS, если не секрет? =)

@ndrey

данный пример - просто абстракция, в реале, конечно, задача гораздо шире.


P.S. временно проблему решил передачей объекта в качестве аргумента, жесть)
 

dark-demon

d(^-^)b
Код:
Function.prototype.bind= function( obj, params ){
	var func= this;
	return function( ){
		return func.apply( obj, params || arguments );
	}
}
f1= obj.func;
f2= obj.func.bind( obj );
f3= obj.func.bind( obj, [1,2,3] );

f1(1, 2); // выполняет функцию в контексте window c параметрами 1,2
f2(1, 2); // выполняет функцию в контексте obj с параметрами 1,2
f3(1, 2); // выполняет функцию в контексте obj с параметрами 1,2,3
 

Alex_aka_SkyNet

Новичок
alekciy
пасиба, позавчера сам уже все нашел, разобрался, сделал )
вот кстати тоже: http://dklab.ru/chicken/nablas/39.html

dark-demon
совершенно верно, я к этому подходу и пришел в итоге.

JS гибкий, удобно когда всё с чем имеешь дело в JS - объекты, в том числе и функции, и события.
гибкость и динамичность нечеловеческая.

довольно скоро пхп пожалуй оставлю для обработки запросов ajax, как только матчасть подтяну) JS эмпанирую все больше

да здравствует вебдваноль =)
 

alekciy

Новичок
Alex_aka_SkyNet
>довольно скоро пхп пожалуй оставлю для обработки
>запросов ajax,
И что же для серверной части решил юзать? JSP?

>да здравствует вебдваноль
Маркетинговая фикция. Не более.
 

Alex_aka_SkyNet

Новичок
серверная часть - пхп, как и был впрочем всегда...

а "маркетинговая финкция" всегда притягивает инвесторов

как ни абсурдно...

а лично меня забавит гибкостью
 
Сверху