使用ES6 Proxy和node.js出现非法调用错误

2023-11-24

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

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

whereas

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

or

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

按预期工作。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用ES6 Proxy和node.js出现非法调用错误 的相关文章

随机推荐

  • 从 WebView 启动自定义 Android 应用程序

    我有一个 HTML 文件 如果我在 Android 本机浏览器中打开它 它就会启动一个应用程序 但是当我尝试在 WebView 中打开相同的应用程序时 它无法启动该应用程序 并且显示 网页不可用 我认为我的 WebView 无法处理为应用程
  • JSF、RichFaces、分页

    我知道这里有很多关于 JSF 分页的帖子 但没有一个让我满意 为了将相当大的数据分割成页面 我将使用 RichFaces 数据滚动器组件 它似乎适合于此 但看起来它是 人工 分页的 我不喜欢这里的是它加载所有数据 然后只显示其中的一部分 至
  • 动态解析逻辑运算 - AND、OR、循环条件

    我有一个传入记录过滤器 存储有逻辑子句 如下所示 Acct1 Y AND Acct2 N AND Acct3 N AND Acct4 N AND Acct5 N AND Acct6 N OR Acct7 N AND Acct1 Y AND
  • f() 和 (f()) 之间有什么区别吗?

    之间有任何区别 var myfunc function return function and var myfunc function return function 这只是风格问题还是第一种形式中的 周围还有更多内容 没有 或者至少在你的
  • 透明背景与 Three.js

    代码有效 但我在使用 Three js 设置画布透明背景时遇到问题 我用 Background renderer setClearColor 0xffffff 0 但随后背景变黑 如何将其更改为透明 代码 var camera scene
  • 如何使用 argparse 创建“对列表”类型的参数?

    我需要让 python 脚本的最终用户输入如下内容 script py sizes lt 2 2 gt lt 3 3 gt lt 6 6 gt 其中的每个元素 sizes选项是一对两个正整数 我怎样才能做到这一点argparse 定义自定义
  • 如何配置 Squirrel SQL 客户端以与 MS Access 一起使用

    我正在努力让 Squirrel SQL 连接到 MS Access 数据库 只是一个普通的数据库 没有密码 我创建一个别名并使用驱动程序 JBDC ODBC 桥 此驱动程序前面有一个勾 我不知道在网址中输入什么 我使用 数据库文件路径 gt
  • 使 GWT 应用程序可由搜索引擎抓取

    我想使用 使我的 GWT 应用程序可爬网的令牌 如下所述 http code google com web ajaxcrawling 在线有一个使用此功能的 GWT 示例应用程序 例如 http gwt google com samples
  • 连接 std::variant 和 std::variant 的类型

    有没有办法从两个现有变体类型声明第三个变体 其中包含两个变体类型的并集 include
  • UIDocument 和 NSFileWrapper 架构和性能

    我们最近将代码转换为使用 UIDocument 而不是直接操作文件系统上的文件 因此我们遇到了一些性能问题 我们想知道我们是否错误地使用了这个类 是否有其他人遇到这些问题 以及解决这些问题的常见方法是什么 Our app 我们有一个 鞋盒应
  • LINQ实际上编译成什么?

    背景 其背景是我最近在评论中与另一位显然知识渊博的用户就 LINQ 的编译方式进行了对话 我先 总结 一下 说LINQ被编译成for循环 虽然这是不正确的 但我对其他堆栈的理解 例如this one是 LINQ 查询被编译为内部有循环的 l
  • Backbone js,更新模型更改视图

    为什么我的视图没有更新
  • 为什么当类被密封时,带有 AutoMoqCustomization 的 Autofixture 不再抱怨缺少无参数构造函数?

    当我使用Moq直接模拟IBuilderFactory并实例化BuilderService我自己在单元测试中 我可以获得通过测试 验证Create 的方法IBuilderFactory被调用一次 但是 当我使用自动夹具 with AutoMo
  • 如何在文本上使用 TinyMCE 函数而不实际选择该文本?

    我有各种 div 我的页面上有 s 单击后会转换为 TinyMCE 编辑器部分 因此 用户只需双击 div 然后使用 TinyMCE 编辑其中的文本即可 我的问题是 是否可以在 div 没有实际选择里面的文本 我的意思是 我想实现以下用例
  • 在 jpa 中调用序列的下一个值

    我有一个映射为实体的类 以将其保存在数据库中 我有一个 id 字段作为主键 因此每次保留对象时 都会从序列 myClass pk seq 中检索 id 的值 代码如下所示 Entity Table name myObjects public
  • 从另一个项目修改 Windows 窗体控件

    我有一个控制lblDate在用户控制中MainScreen 我想在类的方法中修改它Date 这是在另一个项目中AoWLibrary 我无法引用它 因为 AoWLibrary 是第一个项目的依赖项 我尝试将 lblDate 设为静态 但编译器
  • 是否可以将 TypeTag 转换为 Manifest?

    我们的库使用 TypeTags 但现在我们需要与另一个需要清单的库进行交互 有没有简单的方法可以从 TypeTag 创建清单 如果你天真地尝试召唤一个Manifest when a TypeTag存在 编译器会给你一个解决方案的提示 imp
  • 如何在 Qt 中制作可展开/可折叠的部分小部件

    我想在 Qt 中创建一个具有以下功能的自定义小部件 它是一个容器 它可以填充任何 Qt 布局 它可以在任何 Qt 布局内 按钮允许垂直折叠 折叠内容 因此只有按钮可见 所有包含的布局都是不可见的 上一个按钮允许将其再次展开 展开到布局内容的
  • Mongo 对象 ID 不相等

    new Mongo ObjectID 18986769bd5eaaa42cb565b1 new Mongo ObjectID 18986769bd5eaaa42cb565b1 返回假 new Mongo ObjectID 18986769b
  • 使用ES6 Proxy和node.js出现非法调用错误

    我不明白为什么以下代码不起作用 var os new Proxy require os console log os cpus TypeError Illegal invocation whereas var os require os c