Здравствуйте!
Вот есть такой код:
function someClass()
{
this.foo = function()
{
alert('foo');
this.bar();
setTimeout(this.foo,1000);
}
this.bar = function()
{
alert('bar');
}
this.foo();
}
window.onload = function() {new someClass();}
Помогите понять, плиз, почему, если я рекурсивно вызываю метод foo, то вызов this.bar() валится с ошибкой "объект не поддерживает свойство или метод"?
04.06.09 21:58: Перенесено из 'Веб программирование'
Здравствуйте, strelochnik, Вы писали:
S>Помогите понять, плиз, почему, если я рекурсивно вызываю метод foo, то вызов this.bar() валится с ошибкой "объект не поддерживает свойство или метод"?
Потому что после
setTimeout(this.foo, 1000);
вызывается просто функция, в которой не определён this. Можно сделать так:
setTimeout(function(that) { that.foo(); }, 1000, this);
Здравствуйте, anonymous, Вы писали:
Можно сделать так:
A>A>setTimeout(function(that) { that.foo(); }, 1000, this);
A>
Не работает такое в ИЕ к сожалению. Но спасибо — теперь знаю куда копать
Может кому пригодится
Переложила this в переменную, и проблема решилась — теперь в ИЕ тож работает
:
function someClass()
{
this.foo = function()
{
alert('foo');
this.bar();
var someClass = this;
setTimeout(function() {someClass.foo();},1000);
}
this.bar = function()
{
alert('bar');
}
this.foo();
}
window.onload = function() {new someClass();}
Здравствуйте, strelochnik, Вы писали:
S>Не работает такое в ИЕ к сожалению. Но спасибо — теперь знаю куда копать
А, ну да — IE. Вот по теме:
http://forum.dklab.ru/viewtopic.php?t=26629
Здравствуйте, anonymous, Вы писали:
A>Здравствуйте, strelochnik, Вы писали:
S>>Помогите понять, плиз, почему, если я рекурсивно вызываю метод foo, то вызов this.bar() валится с ошибкой "объект не поддерживает свойство или метод"?
A>Потому что после
A>A>setTimeout(this.foo, 1000);
A>
A>вызывается просто функция, в которой не определён this. Можно сделать так:
A>A>setTimeout(function(that) { that.foo(); }, 1000, this);
A>
На самом деле this определен, это обьект вызывающего контекста. В данном случае это объект таймера.
Иллюстрирующий пример пример
function doWithThis() {
alert(this);
}
doWithThis(); // this == window
doWithThis.call("context"); // this == "context"
Если функция обработчик onclick, то this это соответвующий DOM элемент.
this в JS имеет отличную семантику от того же ключевого слова в современных популярных языках, таких как Java, C# т.п.
и почти все на этом накалываются
Здравствуйте, strelochnik, Вы писали:
S> setTimeout(this.foo,1000);
Я в большинстве своих проектов использую такой код:
Function.prototype.bind=function(object) {
var __method=this;return function(){return __method.apply(object,arguments);}
}
и вам останется написать setTimeout(this.foo.bind(this),1000);
как-то так.
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали