为什么clearinterval在这段代码中改变了什么?

时间:2014-03-12 09:26:24

标签: javascript node.js setinterval

var interval = setInterval(function (){
    console.log("Hello world");
}, 1000);

var thing = interval;
console.log(thing);
clearInterval(interval);
console.log("interval cleared");
console.log(thing);
在清除thing之前和之后,

interval的打印方式不同,我无法理解原因。哼哼?

编辑:抱歉,我应该更清楚了。我正在使用node.js,这是上面代码的输出:

{ _idleTimeout: 1000,
  _idlePrev: 
   { _idleNext: [Circular],
     _idlePrev: [Circular],
     msecs: 1000,
     ontimeout: [Function: listOnTimeout] },
  _idleNext: 
   { _idleNext: [Circular],
     _idlePrev: [Circular],
     msecs: 1000,
     ontimeout: [Function: listOnTimeout] },
  _idleStart: 1394616963526,
  _onTimeout: [Function: wrapper],
  _repeat: true }
interval cleared
{ _idleTimeout: -1,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 1394616963526,
  _onTimeout: null,
  _repeat: false,
  ontimeout: null }

为什么thing会受到clearInterval的影响?

2 个答案:

答案 0 :(得分:1)

clearInterval(interval);用于取消setInterval设置的重复操作。

但是在您的代码中,thingclearInterval(interval);之前分配,因此以不同的方式打印。

更新

node.js中的情况不同,在nodejs中,setInterval返回Timer对象但不返回数字。 如此明确interval也将清除thing,因为它们引用相同的对象。

答案 1 :(得分:1)

两个变量intervalthing都指向同一个Timer对象。当您致电clearInterval时,它会修改该对象,这就是console.log显示的内容。

它类似于以下代码:

var obj1 = { a : 3 };
var obj2 = obj1;
obj1.a = 4;
console.log(obj2);

这将记录{ a : 4 }。如果希望两个变量引用不同的对象,则需要克隆该对象;见

What is the most efficient way to deep clone an object in JavaScript?