为什么 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
那么你不应该使用日志记录,而应该使用调试器、断点和调试器中的变量检查器。
我正在学习 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
那么你不应该使用日志记录,而应该使用调试器、断点和调试器中的变量检查器。