Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Передать параметр в функцию, назначить ее на событие. Как? (https://javascript.ru/forum/misc/37562-peredat-parametr-v-funkciyu-naznachit-ee-na-sobytie-kak.html)

oxotnik.na.orlov 24.04.2013 18:25

Передать параметр в функцию, назначить ее на событие. Как?
 
Привет!
Я только недавно начал изучать JS и вот сегодня столкнулся с такой проблемой. Сижу над ней целый день, выручайте :help:

<body>
<script>
	
	Transformer = function() {
		this.name = "Optimus";
	};
	
	Transformer.prototype.getName = function() {
		return this.name;
	};
	
	Informer = function(transformer, rootObject) {
		this.robot = transformer;
		rootObject.innerHTML = '<input id="btn" type="button" value="Push"/>';
		document.getElementById('btn').onclick = this.sayName;
	};
	
	Informer.prototype.sayName = function() {
		alert(this.robot.getName());
	};
	
	var trans = new Transformer();
	var inform = new Informer(trans, document.body);
	
</script>
</body>


Нужно, чтобы по нажатию на кнопку появлялся алерт с текстом "Optimus". Вместо этого получаю this.robot = unidentified по событию onclick. Предполагаю, что проблема кроется в областях видимости this, но хотелось бы ясности.

dmitriymar 24.04.2013 18:36

Цитата:

Сообщение от oxotnik.na.orlov
alert(this.robot.getName());

кто такой robot?

oxotnik.na.orlov 24.04.2013 20:21

Цитата:

Сообщение от dmitriymar (Сообщение 247933)
кто такой robot?

Поле класса Informer, не?

danik.js 24.04.2013 21:14

Цитата:

Сообщение от oxotnik.na.orlov
хотелось бы ясности

Все просто. sayName будет вызван с this, указывающим на элемент - источник события, короче кнопку.
Можно сразу привязать функцию к нужному контексту:
this.sayName.bind(this)

Не будет работать в старых браузерах, гугли решение проблемы сам.

oxotnik.na.orlov 24.04.2013 21:40

danik.js,
Большое Вам спасибо.
Задача решена преобразованием 15-ой строки к виду:
document.getElementById('btn').onclick = this.sayName.bind(this);


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