Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   проблема с setTimeout (https://javascript.ru/forum/events/13640-problema-s-settimeout.html)

leha66 07.12.2010 17:23

проблема с setTimeout
 
Всем привет.

Вот такой пример:
<html>
    <head>
        <title>
            Java Script
        </title>
        <script>
            function myclass(vvar) {
                this.a = vvar
                this.b = 10
            }

            with (myclass) {
                
                prototype.away = function() {
                    alert("away" + " " + this.a + " " + this.b)
                }

                prototype.change = function() {
                    var self = this
                    t = setTimeout(self.away, 100)
                }                 
            }

            var cl = new myclass(10);
        </script>
    </head>
    <body>
        <button name="next" onclick="cl.change()">
            next
        </button>
    </body>
</html>

Ожидалось после нажатия кнопки увидеть: "away 10 10"
На самом деле вывелось: "away undefined undefined"

Причина более менее понятна - типа когда вызывается "away" объекта уже нет. Но вот как исправить не понимаю ибо в программировании - новичёк.

Заранее благодарен за помощь.

Kolyaj 07.12.2010 17:25

http://javascript.ru/tutorial/object/thiskeyword

monolithed 07.12.2010 17:57

<script type="text/javascript">
window.onload = function(){
    var i = 0, j = 0;
    (function(){
        var div = document.getElementsByTagName('div'), input = document.getElementsByTagName('input')[0];
        div[0].innerHTML = i++;
        input.onclick = function(){
           j = i;
           div[1].innerHTML = j;
        };
        window.setTimeout(arguments.callee, 10);
    })();
};
</script>

<div></div>
<div></div>
<input type="button" value="change" />

leha66 08.12.2010 11:16

Спасибо за ответы, однако они к сожалению не помогли :(

Цитата:

Сообщение от Kolyaj (Сообщение 82708)

Из статьи я понял, что если пишется setTimeout(self.away, 100), то this = window. А чтобы this = obj нужно вызвать obj.setTimeout(self.away, 100), но ведь так же нельзя сделать... Или же я что-то неправильно понял?

Цитата:

Сообщение от monolithed (Сообщение 82714)
<script type="text/javascript">
window.onload = function(){
    var i = 0, j = 0;
    (function(){
        var div = document.getElementsByTagName('div'), input = document.getElementsByTagName('input')[0];
        div[0].innerHTML = i++;
        input.onclick = function(){
           j = i;
           div[1].innerHTML = j;
        };
        window.setTimeout(arguments.callee, 10);
    })();
};
</script>

<div></div>
<div></div>
<input type="button" value="change" />

Тут как я понял основная фишка в arguments.callee. Но ведь это же в функции ссылка на на эту же функцию. Но мне-то, как я понимаю, нужна ссылка на другую функцию.


Ещё раз повторюсь - в программировании я новичёк, поэтому буду очень благодарен, если подскажете как изменить конкретно мой пример, чтобы он зароботал как ожидается.

Kolyaj 08.12.2010 11:44

Во-первых, избавиться от with.

Во-вторых,
t = setTimeout(function() { self.away() }, 100)

leha66 08.12.2010 14:13

Цитата:

Сообщение от Kolyaj (Сообщение 82792)
Во-первых, избавиться от with.

Во-вторых,
t = setTimeout(function() { self.away() }, 100)

Большое спасибо, "во-вторых" помогло.

А зачем от with избавляться? С with работает...
Исправил на без with - тоже работает...
Разницу не понял.

Kolyaj 08.12.2010 14:15

Цитата:

Сообщение от leha66
А зачем от with избавляться?

Это я вам на будущее. Проблем вы с ним ещё не скоро огребёте (судя по коду), но в процессе роста обязательно огребёте.
Ещё с ним медленнее.


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