Использование функции в setinterval ошибка JavaScript, используя функцию
Я написал простую функцию, такую как таймер, почему этот код не работает правильно, говорит Uncaught ReferenceError: a не определено почему?
function timeee(sec) {
document.getElementById("main").innerHTML = sec;
--sec;
if (sec == -1) {
clearInterval(cleartext);
}
}
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval("timeee(a)", 1000);
window.cleartext = cl;
}
3 ответа
Как вы можете видеть в этом другом вопросе, когда вы используете setInterval
со строкой функция запускается в глобальной области видимости. Тем не менее, ваш a
переменная устанавливается только локально, поэтому timeee()
функция не может видеть это.
Попробуйте использовать:
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval(function() { timeee(a) }, 1000);
window.cleartext = cl;
}
Или, если вы действительно хотите использовать строку, определите a
как глобальная переменная:
var a;
function timer() {
a = document.getElementById("time").value;
var cl = setInterval("timeee(a)", 1000);
window.cleartext = cl;
}
Зачем?
Объем.
Рассматривать:
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval("timeee(a)", 1000);
window.cleartext = cl;
}
a локально ограничен, но timeee(a) будет вызываться из глобальной области видимости. У него нет доступа к. Пытаться:
var cl = setInterval(function(){timeee(a)}, 1000);
Таким образом, вы держите значение в замыкании. Обратите внимание, что при этом каждый раз будет передаваться одно и то же значение, поэтому вам нужно решить и эту проблему (ответ Банана - один из вариантов).
После некоторых размышлений, я думаю, что ссылка на "а" не является правильным закрытием.
Подумайте об этом так: вы передаете строку setInterval
, Неявно, когда вы передаете строку setInterval
или же setTimeout
, eval()
где-то называется., Потому что во время выполнения интерпретатор не знает, что переменная a
используется в другом месте, он выбросит его. Затем, когда eval
исполняется, аргумент a
там больше нет
Теперь взгляните на решение вашей проблемы:
function timer() {
var a = document.getElementById("time").value;
var cl = setInterval(function() { timeee(a) }, 1000);
window.cleartext = cl;
}
Потому что переводчик знает, что a
будет по-прежнему использоваться через некоторое время, он не будет уничтожен. Это правильное закрытие.