Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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 为什么setInterval()提供循环引用?_Javascript_Node.js_Typeerror_Circular Reference_Stringify - Fatal编程技术网

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我已经更新了我的问题。基本上,不可能序列化任何包含自身引用的对象我理解这一点,但我的问题更多:为什么它包含自身引用?为什么要循环引用?