Использование функции в 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 будет по-прежнему использоваться через некоторое время, он не будет уничтожен. Это правильное закрытие.

Другие вопросы по тегам