js this и контекст

berkut

Новичок
js this и контекст

извиняюсь за название, ничего в голову больше не пришло. как присвоить св-ву объекта внутри метода, метод объекта, в котором выполняется присвоение? вообщем код:
Код:
DescendandSelector.prototype.addSelect = function()
{	
	var select_el = document.createElement('select');
	select_el.onchange = function () { this.change(select_el); } // вот тут беда.
}
т.е. я создаю элемент select и хочу, что-бы по событию onChange вызывался метод объекта, в контексте которого создаю select.
я пишу function () { this.change(select_el); } - и this как я догадываюсь, ссылается на саму анонимную функцию.
в хтмл требуемый результ я получаю так:
... var ds = new DescendandSelector(); ...
<select onchange="ds.change(this)">
а как мне тоже самое проделать в методе addSelect? и как сослаться на select_el?

-~{}~ 16.01.08 21:05:

нужно этот метод change() вызвать в контексте объекта, т.е.
Код:
select_el.onchange = function () { DescendandSelector.change(select_el); }
не подходит
 

dimagolov

Новичок
а что, так:
select_el.onchange = this.change;
не работает?
передавать select_el как параметр не нужно, так как при вызове обработчика onchange внутри ф-ии change this будет показывать на select_el (то есть на тот элемент, который событие сгенерил)

п.с. понимаем, что чтобы this.change показывал на то, что надо AddSelect должен быть вызван как метод объекта ds
 

Scud

Новичок
Код:
DescendandSelector.prototype.addSelect = function()
{	
	var select_el = document.createElement('select');
        var self = this;
	select_el.onchange = function () { self.change(select_el); } 
}
 

berkut

Новичок
чорт. запутался. что лучше использовать из этих вариантов? + я ещё откопал св-во caller и call()/apply(). что юзают настоящие джедаи?
 

dimagolov

Новичок
berkut
лучше то, что проще.
нафига городить замыкание, когда тебе просто надо установить орбаботчик? ссылку на ф-ю получить можешь, ссылка на элемент который этот обработчик вызовет будет в ней доступен (как this) значит просто присваивай обработчик. если бы тебе надо было передавать некие параметры, которые были бы известны на момент установки обработчика, но неизвестнв на момент его вызова то тогда да, замыкание рулит. а в твоем (простейшем) случае нужно применять простейшие методы.
хотя я конечно не знаю, может ты хочешь выполнить обработчик (т.е. ds.change) в момент события не в контексте элемента, а в контексте ds. в этом случае как раз call/apply помогут.
 
Сверху