我正在学习ES6代理,并尝试在get陷阱中了解param'receiver',因此我尝试console.log接收器值。但是在nodeJS中运行时,会导致错误:
RangeError:超出最大调用堆栈大小
let proxy = new Proxy({}, {
get (target, key, receiver) {
console.log('receiver:', receiver)
}
})
let obj = Object.create(proxy)
console.log(obj)
我想知道导致此错误的原因,以及如何在不同情况下测试receiver
的引用。
receiver
中的get (target, key, receiver)
引用了代理对象,因此您创建了一个无限循环。
console.log(obj)
尝试记录obj
的内容,因此它遍历了所有键,并检索了它们的值。要获取其值,将调用代理服务器的get
,并在其中获得console.log('receiver:', receiver)
,并且receiver
指向obj
,因此它再次尝试记录obj
的内容,...这将导致无限递归循环。
如果您想了解get陷阱中的参数receiver
,则不应使用日志记录,而应使用调试器中的调试器,断点和变量检查器。
我希望以下代码有助于解决您的问题。
let proxy = new Proxy({}, {
get: function (target, key, receiver) {
console.log('receiver:' + receiver);
}
});
let obj = Object.create(proxy);
console.log(obj);
这里您创建了一个Proxy对象,它产生了一个永无止境的永无止境的循环。
此错误(超过最大调用堆栈跟踪)表示在代码中的某个位置,您正在调用一个函数,该函数依次调用另一个函数,依此类推,直到达到调用堆栈限制。这几乎总是因为没有满足基本情况的递归函数。
+(string concatenation operator)with object将在对象上调用toString方法,并返回一个字符串。因此,“ +对象等效于object.toString()。对象上的toString返回“ [[对象对象]”。
With,对象作为单独的参数传递给log方法。因此,这将花费大量时间单独为控制台日志提供参数,并使“最大调用堆栈跟踪超出”错误。
所以,根据我,我希望这是问题所在。