Доступность имен полей функций
Имеется код:
function foo(domId)
{
this.container = document.getElementById(domId);
}
foo.prototype =
{
f1: function()
{
var btn = document.createElement('INPUT');
btn.setAttribute('type','button');
btn.setAttribute('value','Button 1');
btn.onclick = this.f2;
this.container.appendChild( btn ); // кнопка успешно добавляется
},
f2: function()
{
alert(this.container); // "undefined" ?!!
}
}
var ff = new foo('block1');
ff.f1();
Вопрос: почему container не доступен в f2 и как это исправить? Т.е. какие тут имеются пространства имен (наверное вопрос в этом)? |
Нашел решение: вместо
this.container = document.getElementById(domId); в конструкторе писать foo.prototype.container = document.getElementById(domId); Вроде this не относится к прототипу функции, а только к контексту её вызова. |
вызывает то функцию f2 обработчик событий, поэтому и не доступен функции старый контекст
оберните вызов события в функцию:
var self = this;
btn.onclick = function() {
self.f2.apply( self, arguments );
}
|
Благодарю, мне эта мысль (сохранение текущего контекста) бы в голову и не пришла, хотя ответ и на поверхности)
|
| Часовой пояс GMT +3, время: 20:10. |