我不明白为什么以下代码不起作用:
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(使用前将#替换为@)