javascript - 如何启动 setInterval 的计数器

标签 javascript setinterval hoisting

我的代码可以运行,但我想改进它:

var c = canvas.getContext("2d"); 
//this is called as an object method I created
var animar = function () {
   var obj = this;//saves the object that called it to later access to its properties
   var counter= 0;
   var animacion = setInterval(function(){
            c.save()
            c.clearRect(0, 0, canvas.width, canvas.height);
            c.rotate(0.1*counter);
            obj.pintar();
            c.restore();
            counter++;

   }, 50);
}

我想使用外部函数以供将来使用,但是当我更改我的代码时,存在提升问题,并且我不知道如何在不覆盖它的情况下获取 rotar() 函数内部的计数器一直以来:

var animar = function () {
    var obj = this;
    var counter= 0;
    var animacion = setInterval(function(){
        rotar(obj)
    }, 50);
}

function rotar (obj) {
    c.save()
    c.clearRect(0, 0, canvas.width, canvas.height);
    c.rotate(0.1*counter);
    obj.pintar();
    c.restore();
    counter++;
}

我知道第一个示例有效,因为它们是嵌套的,而第二个示例则不然。如何在不使用全局变量的情况下获得 setInterval 的计数器? (我的意思是...如果我第二次调用它,它不会从 0 开始。如果我在 animar() 函数中将其设置为 0,它会起作用,但随后我需要将其设置为 0在每个使用计数器或使用具有不同名称的计数器的函数中。这两种可能性听起来不太好。) 谢谢

最佳答案

您只需将 var counter = 0 放在函数之外即可:

var counter;
var animar = function () {
    var obj = this;
    counter = 0; // reset every time before 'animacion'...
    var animacion = setInterval(function(){
        rotar(obj)
    }, 50);
}
function rotar (obj) {
    c.save()
    c.clearRect(0, 0, canvas.width, canvas.height);
    c.rotate(0.1*contador);
    obj.pintar();
    c.restore();
    counter++;
}

或者,如果您不需要全局变量,您可以按照 Walter 的回答,或者执行以下操作:

var animar = function () {
    var obj = this;
    var counter = 0; // new variable every time animar() is called
    var animacion = setInterval(function(){
        rotar(obj, counter);
        counter++;
    }, 50);
}
function rotar (obj, counter) {
    c.save()
    c.clearRect(0, 0, canvas.width, canvas.height);
    c.rotate(0.1*contador);
    obj.pintar();
    c.restore();
}

关于javascript - 如何启动 setInterval 的计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23640432/

相关文章:

sql-server - 微软 SQL : How are variables and aliases evaluated within query execution?

javascript - 编程语言中变量提升的优点和缺点是什么?

javascript - 如何在javascript中使firebase数据库中的变量全局化

javascript - 将 useState 与 setInterval 内的 if 条件一起使用不起作用

javascript - 为什么计时器没有按预期工作?

javascript - react : setInterval Not working after one interval

javascript - 变量提升示例

javascript - 在编译的 javascript 中触发回调

javascript - 下拉菜单未显示

javascript - 处理 JSON 中的 html 代码