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的影响?
答案 0 :(得分:1)
clearInterval(interval);
用于取消setInterval
设置的重复操作。
但是在您的代码中,thing
在clearInterval(interval);
之前分配,因此不以不同的方式打印。
的更新强> 的
node.js
中的情况不同,在nodejs中,setInterval
返回Timer对象但不返回数字。
如此明确interval
也将清除thing
,因为它们引用相同的对象。
答案 1 :(得分:1)
两个变量interval
和thing
都指向同一个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?