Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.12.2010, 17:23
Новичок на форуме
Отправить личное сообщение для leha66 Посмотреть профиль Найти все сообщения от leha66
 
Регистрация: 07.12.2010
Сообщений: 7

проблема с 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" объекта уже нет. Но вот как исправить не понимаю ибо в программировании - новичёк.

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

Последний раз редактировалось leha66, 08.12.2010 в 11:06.
Ответить с цитированием
  #2 (permalink)  
Старый 07.12.2010, 17:25
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

http://javascript.ru/tutorial/object/thiskeyword
Ответить с цитированием
  #3 (permalink)  
Старый 07.12.2010, 17:57
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

<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" />
Ответить с цитированием
  #4 (permalink)  
Старый 08.12.2010, 11:16
Новичок на форуме
Отправить личное сообщение для leha66 Посмотреть профиль Найти все сообщения от leha66
 
Регистрация: 07.12.2010
Сообщений: 7

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

Сообщение от Kolyaj Посмотреть сообщение
http://javascript.ru/tutorial/object/thiskeyword
Из статьи я понял, что если пишется setTimeout(self.away, 100), то this = window. А чтобы this = obj нужно вызвать obj.setTimeout(self.away, 100), но ведь так же нельзя сделать... Или же я что-то неправильно понял?

Сообщение от monolithed Посмотреть сообщение
<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. Но ведь это же в функции ссылка на на эту же функцию. Но мне-то, как я понимаю, нужна ссылка на другую функцию.


Ещё раз повторюсь - в программировании я новичёк, поэтому буду очень благодарен, если подскажете как изменить конкретно мой пример, чтобы он зароботал как ожидается.
Ответить с цитированием
  #5 (permalink)  
Старый 08.12.2010, 11:44
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Во-вторых,
t = setTimeout(function() { self.away() }, 100)
Ответить с цитированием
  #6 (permalink)  
Старый 08.12.2010, 14:13
Новичок на форуме
Отправить личное сообщение для leha66 Посмотреть профиль Найти все сообщения от leha66
 
Регистрация: 07.12.2010
Сообщений: 7

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

Во-вторых,
t = setTimeout(function() { self.away() }, 100)
Большое спасибо, "во-вторых" помогло.

А зачем от with избавляться? С with работает...
Исправил на без with - тоже работает...
Разницу не понял.
Ответить с цитированием
  #7 (permalink)  
Старый 08.12.2010, 14:15
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача контекста через setTimeout decadent jQuery 3 10.02.2011 19:01
setTimeout + перегруженый процессор = ??? Slawaq Events/DOM/Window 7 25.11.2010 23:41
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Аргументы в setTimeout - проблема в IE 6 micscr Общие вопросы Javascript 8 28.09.2009 13:08
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47