为什么get.Handler中的console.log接收器值引起错误?

问题描述 投票:1回答:2

我正在学习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的引用。

es6-proxy
2个回答
0
投票

receiver中的get (target, key, receiver)引用了代理对象,因此您创建了一个无限循环。

console.log(obj)尝试记录obj的内容,因此它遍历了所有键,并检索了它们的值。要获取其值,将调用代理服务器的get,并在其中获得console.log('receiver:', receiver),并且receiver指向obj,因此它再次尝试记录obj的内容,...这将导致无限递归循环。

如果您想了解get陷阱中的参数receiver,则不应使用日志记录,而应使用调试器中的调试器,断点和变量检查器。


0
投票

我希望以下代码有助于解决您的问题。

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方法。因此,这将花费大量时间单独为控制台日志提供参数,并使“最大调用堆栈跟踪超出”错误。

所以,根据我,我希望这是问题所在。

© www.soinside.com 2019 - 2024. All rights reserved.