Javascript: рекурсия
От: strelochnik  
Дата: 04.06.09 16:17
Оценка:
Здравствуйте!
Вот есть такой код:

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: Перенесено из 'Веб программирование'
Re: Javascript: рекурсия
От: anonymous Россия http://denis.ibaev.name/
Дата: 04.06.09 17:01
Оценка: 1 (1) +1
Здравствуйте, strelochnik, Вы писали:

S>Помогите понять, плиз, почему, если я рекурсивно вызываю метод foo, то вызов this.bar() валится с ошибкой "объект не поддерживает свойство или метод"?


Потому что после
setTimeout(this.foo, 1000);

вызывается просто функция, в которой не определён this. Можно сделать так:
setTimeout(function(that) { that.foo(); }, 1000, this);
Re[2]: Javascript: рекурсия
От: strelochnik  
Дата: 04.06.09 17:53
Оценка:
Здравствуйте, anonymous, Вы писали:

Можно сделать так:
A>
A>setTimeout(function(that) { that.foo(); }, 1000, this);
A>

Не работает такое в ИЕ к сожалению. Но спасибо — теперь знаю куда копать
Re: Javascript: рекурсия - решено
От: strelochnik  
Дата: 05.06.09 08:46
Оценка:
Может кому пригодится
Переложила 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();}
Re[3]: Javascript: рекурсия
От: anonymous Россия http://denis.ibaev.name/
Дата: 05.06.09 12:56
Оценка:
Здравствуйте, strelochnik, Вы писали:

S>Не работает такое в ИЕ к сожалению. Но спасибо — теперь знаю куда копать


А, ну да — IE. Вот по теме: http://forum.dklab.ru/viewtopic.php?t=26629
Re[2]: Javascript: рекурсия
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 10.06.09 07:24
Оценка:
Здравствуйте, 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# т.п.
и почти все на этом накалываются
Re: Javascript: рекурсия
От: Senyai Россия http://www.arseniy.net
Дата: 10.06.09 19:34
Оценка:
Здравствуйте, 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);
как-то так.
Не бойтесь совершенства. Вам его не достичь. © Сальвадор Дали
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.