gpt4 book ai didi

node.js - 使用 ES6 Proxy 和 node.js 的非法调用错误

转载 作者:搜寻专家 更新时间:2023-10-31 23:40:49 24 4
gpt4 key购买 nike

我不明白为什么下面的代码不起作用:

var os = new Proxy(require('os'), {});
console.log( os.cpus() ); // TypeError: Illegal invocation

鉴于

var os = require('os');
console.log(Reflect.apply(os.cpus, os, []));

var os = new Proxy(require('os'), {});
console.log( os.platform() );

按预期工作。

最佳答案

刚刚浏览了 os package 的源代码在 Node 存储库中,cpus() 似乎是从 binding.getCPUs 导出的这是 Node 运行时环境中的 C 钩子(Hook)。

cpus() 因此将 binding 对象作为函数上下文,然后通过代理丢失,给您 IllegalInvocation 错误因为当你调用它时没有函数的上下文——尽管我不清楚细节。

另一方面,

platform() 导出为 function () { return process.platform; },因此它只是一个返回对象的函数,不需要在特定的上下文中运行,因为 Node 函数上下文将默认指定 process 变量(除非它已被覆盖)。

以下行为表明将 os 作为 cpus 函数的上下文应用将起作用——函数对象上的代理在调用属性时显然会丢失函数上下文。

const os = require('os');
const proxy = new Proxy(os, {}); // proxy of object, functions called get proxy context rather than os context
const cpus = new Proxy(os.cpus, {}); // proxy of function, still has os context

console.log(os.cpus()); // works (duh)
console.log(cpus()); // works
console.log(proxy.cpus.apply(os, [])); // works
console.log(proxy.cpus()); // fails with IllegalInvocation

注意:如果有人可以清除有关 JS 函数上下文的详细信息以获得答案,我也很乐意阅读它。

关于node.js - 使用 ES6 Proxy 和 node.js 的非法调用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42496414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com