为什么 get 处理程序中的 console.log 接收器值会导致错误?

Why console.log receiver value in get handler cause an error?

我正在学习 ES6 Proxy,并试图理解 get 陷阱中的参数 'receiver',所以我尝试 console.log 接收者值。但是在nodeJS中运行时,会报错:

RangeError: Maximum call stack size exceeded

let proxy = new Proxy({}, {
  get (target, key, receiver) {
    console.log('receiver:', receiver)
  }
})
let obj = Object.create(proxy)
console.log(obj)

我想知道是什么导致了这个错误,以及如何在不同情况下测试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 等价于 object.toString()。对象上的 toString returns "[object Object]".

使用 ,对象作为单独的参数传递给日志方法。因此,这需要花费很多时间来单独向控制台日志提供参数并产生 "maximum call stack trace exceed" 错误。

所以根据我的说法,我希望这应该是问题所在。

get (target, key, receiver)中的receiver引用了Proxy对象,所以你创建了一个死循环。

console.log(obj) 尝试记录 obj 的内容,因此它遍历其所有键,并检索它们的值。为了获得它们的价值,代理的 get 被调用,在那个 get 中你有 console.log('receiver:', receiver),那里 receiver 指的是 obj,所以它再次尝试记录obj 的内容,...导致无限递归循环。

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