new Something({
    events:{
        load: (function loopsiloop(){

            console.log(this);  // firstime this will be Something, but next call what its

            setTimeout(function(){
                console.log(this);
                $.ajax({
                    url: 'foo.htm',
                    context: this,
                    success: function( response ){
                        // do something with the response
                    },
                    error: function(){
                        // do some error handling.  you
                        // should probably adjust the timeout
                        // here.
                    },
                    complete: function(){
                        loopsiloop(); // recurse  //need to bind this here like loopsiloop().bind(this)
                    }
                });
            }.bind(this), 5000);
        }),
        click: function(){
            alert("clicked");
        }
    }

})

Пожалуйста, просмотрите код и прочитайте комментарии, здесь проблема в том, что мне нужно использовать this в функции setTimeOut, поэтому я связываю this с setTimeOut, но когда я вызывая функцию как рекурсивную, значение this не будет таким же

NB. - Я не хочу передавать объект в функцию и не хочу использовать setIntervel (http://www.erichynds.com/javascript/a-recursive-settimeout-pattern/ )

0
Miqdad Ali 4 Фев 2013 в 14:57

2 ответа

Лучший ответ

Ваш рекурсивный вызов может быть записан так:

complete: function() {
    loopsiloop.call(this);
}

Чтобы убедиться, что контекст установлен правильно во второй раз.

Это также может быть написано так, но это не рекомендуется, так как будет вызывать .bind снова и снова на каждом проходе:

complete: loopsiloop().bind(this)  // NB: no function wrap, just passes the ref
2
Alnitak 4 Фев 2013 в 11:07

Не связывайте и не используйте this. Установите var someVariable = this; перед вызовом setTimeout и оставьте его в области видимости для рекурсии (используя его вместо this внутри функции).

0
Quentin 4 Фев 2013 в 10:59