Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以用同一个id调用clearInterval两次吗?_Javascript - Fatal编程技术网

Javascript 我可以用同一个id调用clearInterval两次吗?

Javascript 我可以用同一个id调用clearInterval两次吗?,javascript,Javascript,我使用的是一种繁琐的逻辑: function handle_register_after_pressed(){ if (typeof handle_register_after_pressed.sid !== "undefined" && ff_handle_register_after_pressed.sid) { clearInterval(handle_register_after_pressed.sid); ff_handl

我使用的是一种繁琐的逻辑:

function handle_register_after_pressed(){
    if (typeof handle_register_after_pressed.sid !== "undefined" && ff_handle_register_after_pressed.sid)
    {
        clearInterval(handle_register_after_pressed.sid);
        ff_handle_register_after_pressed.sid = 0;
    }
    handle_register_after_pressed.sid = setInterval(function(){},1000);
}
我想取消旧的
setInterval
,如果再次调用该函数,则重新启动它

是否可以使用这种方式:

function handle_register_after_pressed(){
     if (typeof handle_register_after_pressed.sid !== "undefined" )
     {
         clearInterval(handle_register_after_pressed.sid);
     }
     handle_register_after_pressed.sid = setInterval(function(){},1000);
 }
所以我想问:

  • 如果id是从
    setTimeout
    返回的,
    clearInterval
    是唯一的并且不断增加的吗
  • 在同一个返回的id上再次调用
    setTimeout
    clearInterval
    ,没有问题
  • 当id为0或null或
    未定义时
    我们也可以调用
    setTimeout
    clearInterval
    ,而不会生成异常

setInterval的返回值只是用于传递回clearInterval的唯一数字。它不是包含任何附加信息的对象

因此,此代码
if(按下.sid后的句柄寄存器类型!=“未定义”)
将不起作用,因为按下.sid后的句柄寄存器在执行clearInterval后不会设置为未定义或空

如果您想知道是否清除了间隔,则需要提出如下自定义解决方案

function mySetInterval(fn, interval) {
    var id = setInterval(fn, interval);
    this.cleared = false;
    this.clear = function () {
        this.cleared = true;
        clearInterval(id);
    };
}
然后这样称呼它

var t = new mySetInterval(function () {
    console.log('this is a test');
}, 5000);
console.log(t.cleared); // false
t.clear();
console.log(t.cleared); // true
要回答你剩下的问题

  • 是,从setTimeout和setInterval返回的id在当前网页的生存期内是唯一的。此外,setInterval()和setTimeout()使用的ID池是共享的,这意味着它是一个不断增加的计数器

  • 如果在同一id上调用clearInterval,则没有问题。一旦生成了interval id,即使在清除该间隔之后(直到当前网页的生存期),它也不会返回到id池

  • 如果您使用无效参数调用clearInterval(如null、undefined或0),则不会产生问题。它不会抛出任何异常。你很安全


  • setInterval的返回值只是用于传递回clearInterval的唯一数字。它不是包含任何附加信息的对象

    因此,此代码
    if(按下.sid后的句柄寄存器类型!=“未定义”)
    将不起作用,因为按下.sid后的句柄寄存器在执行clearInterval后不会设置为未定义或空

    如果您想知道是否清除了间隔,则需要提出如下自定义解决方案

    function mySetInterval(fn, interval) {
        var id = setInterval(fn, interval);
        this.cleared = false;
        this.clear = function () {
            this.cleared = true;
            clearInterval(id);
        };
    }
    
    然后这样称呼它

    var t = new mySetInterval(function () {
        console.log('this is a test');
    }, 5000);
    console.log(t.cleared); // false
    t.clear();
    console.log(t.cleared); // true
    
    要回答你剩下的问题

  • 是,从setTimeout和setInterval返回的id在当前网页的生存期内是唯一的。此外,setInterval()和setTimeout()使用的ID池是共享的,这意味着它是一个不断增加的计数器

  • 如果在同一id上调用clearInterval,则没有问题。一旦生成了interval id,即使在清除该间隔之后(直到当前网页的生存期),它也不会返回到id池

  • 如果您使用无效参数调用clearInterval(如null、undefined或0),则不会产生问题。它不会抛出任何异常。你很安全


  • 那么,为什么不在全局范围内定义一个变量,并在函数中清除/重置它。。。也许让间隔检查它也是当前时间,所以当它达到0时,它可以重置或清除,这取决于你的期望。。。你说的“同一身份证上两次”是什么意思?您的意思是对具有相同ID的多个或同一个调用clearinterval两次?
    typeof handle\u register\u在按下.sid之后!==未定义的
    不执行任何操作。未定义的值的计算结果为falsey,您的
    if
    语句只有在定义了
    handle\u register\u之后才能计算为true,由于setInterval的返回值为非零,因此只有当您有一个有效的intervals时,它才应该为真。为什么不在全局范围中定义一个变量,并在函数中清除/重置它。。。也许让间隔检查它也是当前时间,所以当它达到0时,它可以重置或清除,这取决于你的期望。。。你说的“同一身份证上两次”是什么意思?您的意思是对具有相同ID的多个或同一个调用clearinterval两次?
    typeof handle\u register\u在按下.sid之后!==未定义的
    不执行任何操作。未定义的值的计算结果为falsey,您的
    if
    语句只能在定义了
    handle\u register\u之后才计算为true。sid
    ,并且由于setInterval的返回值为非零,因此只有在具有有效间隔时才应为true