Доступность имен полей функций
Имеется код:
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, время: 10:33. |