х не определен, проблема setTimeout - PullRequest
2 голосов
/ 23 сентября 2010

С помощью следующего кода я получаю ошибку clock is not defined, почему?

$(function(){   
    function clock() {
        var nd = new Date();
        var h, m, s;
        h = nd.getHours();
        m = nd.getMinutes();
        s = nd.getSeconds();
        if (h <= 9) h = "0" + h;
        if (m <= 9) m = "0" + m;
        if (s <= 9) s = "0" + s;
        $('#digital-clock .hour').text(h+':');
        $('#digital-clock .min').text(m+':');
        $('#digital-clock .sec').text(s);
    }
    setTimeout('clock()', 1000);
});

Ответы [ 3 ]

9 голосов
/ 23 сентября 2010

Поскольку при передаче строки в setTimeout код внутри нее будет выполняться в глобальной области видимости во время ожидания. Код в глобальной области не имеет доступа ни к одной из локальных переменных, присутствующих во время вызова setTimeout.

Не передавайте строку в setTimeout, она неизменно отстой (в основном это отложенный eval, а мы все ненавидим eval, а? Вместо этого используйте Function объект:

setTimeout(clock, 1000);

Вы также можете использовать встроенное выражение функции для создания своей функции, например:

setTimeout(function() {
    var nd= new Date();
    ...
}, 1000);
6 голосов
/ 23 сентября 2010

Попробуйте это:

$(function(){   
    function clock() {
        var nd = new Date();
        var h, m, s;
        h = nd.getHours();
        m = nd.getMinutes();
        s = nd.getSeconds();
        if (h <= 9) h = "0" + h;
        if (m <= 9) m = "0" + m;
        if (s <= 9) s = "0" + s;
        $('#digital-clock .hour').text(h+':');
        $('#digital-clock .min').text(m+':');
        $('#digital-clock .sec').text(s);
    }
    setTimeout(clock, 1000);
});
0 голосов
/ 23 сентября 2010

Что с этим не так?

$(function(){
    setTimeout(function() {
        var nd = new Date();
        var h, m, s;
        h = nd.getHours();
        m = nd.getMinutes();
        s = nd.getSeconds();
        if (h <= 9) h = "0" + h;
        if (m <= 9) m = "0" + m;
        if (s <= 9) s = "0" + s;
        $('#digital-clock .hour').text(h+':');
        $('#digital-clock .min').text(m+':');
        $('#digital-clock .sec').text(s);
    }, 1000);
});

Если только по какой-то причине вам не нужно ссылаться на функцию по имени позже ...

...