Javascript 为什么setInterval()提供循环引用?
考虑到以下准则:Javascript 为什么setInterval()提供循环引用?,javascript,node.js,typeerror,circular-reference,stringify,Javascript,Node.js,Typeerror,Circular Reference,Stringify,考虑到以下准则: let id = setInterval(function f() {console.log("Nice.");}, 1000); console.log(id); JSON.stringify(id); 最后一行出现了一个错误,上面写着TypeError:Converting circular structure to JSON 控制台日志(id)提供 Timeout { _called: false, _idleTimeout: 1000, _idlePrev
let id = setInterval(function f() {console.log("Nice.");}, 1000);
console.log(id);
JSON.stringify(id);
最后一行出现了一个错误,上面写着TypeError:Converting circular structure to JSON
控制台日志(id)提供
Timeout {
_called: false,
_idleTimeout: 1000,
_idlePrev:
TimersList {
_idleNext: [Circular],
_idlePrev: [Circular],
_timer: Timer { '0': [Function: listOnTimeout], _list: [Circular] },
_unrefed: false,
msecs: 1000,
nextTick: false },
_idleNext:
TimersList {
_idleNext: [Circular],
_idlePrev: [Circular],
_timer: Timer { '0': [Function: listOnTimeout], _list: [Circular] },
_unrefed: false,
msecs: 1000,
nextTick: false },
_idleStart: 81,
_onTimeout: [Function: f],
_timerArgs: undefined,
_repeat: 1000,
_destroyed: false,
[Symbol(asyncId)]: 6,
[Symbol(triggerAsyncId)]: 1 }
为什么超时对象包含循环引用?包含对自身的引用(可通过访问)
实际上,您可以在控制台.log()中看到它。输出:
TimersList {
_idleNext: [Circular],
_idlePrev: [Circular],
_timer: Timer { '0': [Function: listOnTimeout], _list: [Circular] },
_unrefed: false,
msecs: 1000,
nextTick: false },
_idleNext:
无法使用JSON.stringify()对其进行序列化,因为该对象包含对自身的引用,该对象也包含对自身的引用,并且该对象也包含对自身的引用(请参见此处的内容?)包含对自身的引用(可通过访问)
实际上,您可以在控制台.log()中看到它。输出:
TimersList {
_idleNext: [Circular],
_idlePrev: [Circular],
_timer: Timer { '0': [Function: listOnTimeout], _list: [Circular] },
_unrefed: false,
msecs: 1000,
nextTick: false },
_idleNext:
您无法使用JSON.stringify()
对其进行序列化,因为该对象包含对自身的引用,该对象也包含对自身的引用,并且该对象还包含对自身的引用(请参见此处的内容?请注意,在node.js中的行为与在javascript中的行为不同。javascript版本返回一个整数node.js,不用于序列化。请注意,node.js中的行为与javascript中的行为不同。虽然javascript版本返回一个整数node.js,但它不是用于序列化的。如果要“序列化”超时对象,可以使用如下帮助器类。这将通过将超时存储在内部TimeoutHelper.timeouts
字段中来序列化超时,并返回一个ID,您可以稍后使用TimeoutHelper.clearTimeout(i)
:
let TimeoutHelper=(()=>{
设helper={};
设计数器=0;
让超时={};
helper.setInterval=(fn,ms)=>{
让currCounter=计数器++;
超时[电流计数器]=窗口设置间隔(fn,ms);
返回计数器;
}
helper.clearTimeout=(id)=>{
如果(超时类型[id]=“未定义”){
return;//Mimic window.clearTimeout,如果ID不存在,则以静默方式返回
}
清除间隔(超时[id]);
删除超时[id];
}
返回助手;
})();
var i=TimeoutHelper.setInterval(()=>console.log('test'),1000);
log(`Serialized TimeoutHelper id:${i}`);
设置超时(()=>{
log(`clearingtimeout:${i}`);
TimeoutHelper.clearTimeout(i);
}, 5000);代码>如果要“序列化”超时对象,可以使用下面这样的帮助器类。这将通过将超时存储在内部TimeoutHelper.timeouts
字段中来序列化超时,并返回一个ID,您可以稍后使用TimeoutHelper.clearTimeout(i)
:
let TimeoutHelper=(()=>{
设helper={};
设计数器=0;
让超时={};
helper.setInterval=(fn,ms)=>{
让currCounter=计数器++;
超时[电流计数器]=窗口设置间隔(fn,ms);
返回计数器;
}
helper.clearTimeout=(id)=>{
如果(超时类型[id]=“未定义”){
return;//Mimic window.clearTimeout,如果ID不存在,则以静默方式返回
}
清除间隔(超时[id]);
删除超时[id];
}
返回助手;
})();
var i=TimeoutHelper.setInterval(()=>console.log('test'),1000);
log(`Serialized TimeoutHelper id:${i}`);
设置超时(()=>{
log(`clearingtimeout:${i}`);
TimeoutHelper.clearTimeout(i);
}, 5000);代码>你为什么要JSON.stringifying它?你为什么要JSON.stringifying它?是的,我在那里看到了循环。我的主要问题是,;为什么?@kramer65我已经更新了我的问题。基本上,不可能序列化任何包含自身引用的对象我理解这一点,但我的问题更多:为什么它包含自身引用?循环引用的原因是什么?是的,我在那里看到了循环。我的主要问题是,;为什么?@kramer65我已经更新了我的问题。基本上,不可能序列化任何包含自身引用的对象我理解这一点,但我的问题更多:为什么它包含自身引用?为什么要循环引用?