Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Доступность имен полей функций (https://javascript.ru/forum/events/28118-dostupnost-imen-polejj-funkcijj.html)

z4p 08.05.2012 13:49

Доступность имен полей функций
 
Имеется код:
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 и как это исправить?
Т.е. какие тут имеются пространства имен (наверное вопрос в этом)?

z4p 08.05.2012 22:55

Нашел решение: вместо
this.container = document.getElementById(domId);

в конструкторе писать
foo.prototype.container = document.getElementById(domId);

Вроде this не относится к прототипу функции, а только к контексту её вызова.

devote 08.05.2012 23:17

вызывает то функцию f2 обработчик событий, поэтому и не доступен функции старый контекст

оберните вызов события в функцию:
var self = this;
btn.onclick = function() {
    self.f2.apply( self, arguments );
}

z4p 09.05.2012 12:59

Благодарю, мне эта мысль (сохранение текущего контекста) бы в голову и не пришла, хотя ответ и на поверхности)


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