【问题标题】:Why console.log receiver value in get handler cause an error?为什么 get 处理程序中的 console.log 接收器值会导致错误?
【发布时间】:2020-09-02 22:00:06
【问题描述】:

我正在学习 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


    【解决方案1】:

    希望下面的代码能帮助解决你的问题。

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

    在这里您创建了一个代理对象,它会形成一个永无止境的无限循环。

    此错误(超出最大调用堆栈跟踪)意味着在您的代码中某处,您正在调用一个函数,该函数又调用另一个函数,依此类推,直到您达到调用堆栈限制。这几乎总是因为具有未满足基本情况的递归函数。

    +(string concatenation operator) with object 将调用 object 上的 toString 方法并返回一个字符串。所以,'' + object 等价于 object.toString()。对象上的 toString 返回“[object Object]”。

    使用 ,对象作为单独的参数传递给 log 方法。因此,单独向控制台日志提供参数需要花费大量时间,并导致“超出最大调用堆栈跟踪”错误。

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

    【讨论】:

    • 为什么你认为这会解决问题?你应该添加一些关于它的解释。
    • 感谢@t.niese 的善意建议。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多