2015-02-15 2 views
-1

Я сделал простой цифровой часы в JavaScript:Uncaught ReferenceError: XXX не определен

window.onload = function runMiniClock() 
{ 
var time = new Date(); 
var hours = time.getHours(); 
var minutes = time.getMinutes(); 
minutes=((minutes < 10) ? "0" : "") + minutes; 
ampm = (hours >= 12) ? "PM" : "AM"; 
hours=(hours > 12) ? hours-12 : hours; 
hours=(hours == 0) ? 12 : hours; 
var clock = hours + 1 + ":" + minutes + " " + ampm; 
if(clock != document.getElementById('clock').innerHTML) 
document.getElementById('clock').innerHTML = clock; 
timer = setTimeout("runMiniClock()",1000); 
setInterval(function(){ 
document.getElementById("clock").innerHTML = (new Date()).toLocaleTimeString(); 
}, 1000); 
} 

Этот код работает отлично, но когда я открываю консоль появляется сообщение об ошибке:

Uncaught ReferenceError: runMiniClock is not defined

Почему это сообщение об ошибке?

Here is the demo

+3

... потому что у вас нет функции под названием 'runMiniClock' в вашей демонстрации? – JJJ

+0

Попробуйте определить функцию отдельно, а затем иметь строку 'window. onload = runMiniClock() 'только? –

+0

@AaronD: не нравится, нет. – Bergi

ответ

5

Поскольку runMiniClock не глобальная функция, это локальное имя выражения функции, присвоенный window.onload.

Это eval -string вы передаете в setTimeout, однако, оценивается в глобальном масштабе, где он не находит функцию, которая будет вызвана. Вы все равно должны всегда передавать функции, а не строки, до setTimeout.

Вы можете исправить это с помощью

timer = setTimeout(runMiniClock, 1000); 

Также обратите внимание, что у вас есть две различных функций настройки на innerHTML из #clock различных значений, вы хотите, только один из них. И вам не хватает нескольких variable declarations, для ampm и timer.

(updated demo)

0

Чтобы быть абсолютно честным я не тратить слишком много времени, глядя на это. Но ваши часы, кажется, работают нормально, без вызова setTimeout?

Я взял его в этом Js скрипку

http://jsfiddle.net/o35arzre/5/

и часы все еще работает и с шагом соответственно.

Вы уверены, что это необходимо?

var time = new Date(); 
var hours = time.getHours(); 
var minutes = time.getMinutes(); 
minutes=((minutes < 10) ? "0" : "") + minutes; 
ampm = (hours >= 12) ? "PM" : "AM"; 
hours=(hours > 12) ? hours-12 : hours; 
hours=(hours == 0) ? 12 : hours; 
var clock = hours + 1 + ":" + minutes + " " + ampm; 
if(clock != document.getElementById('clock').innerHTML) document.getElementById('clock').innerHTML = clock; 
setInterval(function(){ 
document.getElementById("clock").innerHTML = (new Date()).toLocaleTimeString(); 
}, 1000);