Node.js中使用Object.assign合并到global后无法直接访问方法的问题
解决Node.js中通过Object.assign为global添加方法后无法直接调用的问题
这个问题我之前也碰到过,核心问题出在你对global变量的赋值方式上——你并没有真正修改全局对象本身,只是在模块作用域里替换了global这个局部引用的指向,导致方法没挂载到正确的全局对象上。
问题根源
你写的global = Object.assign(utils, global)逻辑是反的:在Node.js模块中,global是一个指向全局对象的局部变量,直接给它赋值只会修改当前模块内的这个引用,并不会改动真正的全局对象。这就导致你写的awesomeFunc、otherCoolFunc其实并没有被挂载到全局作用域里,自然没法直接调用。
正确的实现方式
反过来,把utils的属性合并到已有的全局对象上,而不是重新赋值global变量:
let utils = { awesomeFunc: (num1, num2) => { if (num1 == 9 && num2 == 10) return 21; return num1 + num2; }, otherCoolFunc: () => { return 27 / 0; } } // 将utils的属性合并到原global对象上 Object.assign(global, utils); // 现在可以直接调用全局方法了 console.log(awesomeFunc(9, 10)); // 输出 21 console.log(otherCoolFunc()); // 输出 Infinity
原理说明
Object.assign(target, source)的作用是把source对象的可枚举属性复制到target对象中。这里我们用global作为目标对象,就直接把utils里的方法挂载到了真正的全局对象上,而不是替换global的引用。这样全局作用域里就有了这些方法,自然可以直接调用。
其他可选实现方式
如果你不想用Object.assign,也可以手动遍历utils的属性并挂载到global上,效果完全一致:
// 方式1:for-in循环 for (const key in utils) { if (utils.hasOwnProperty(key)) { global[key] = utils[key]; } } // 方式2:Object.keys遍历 Object.keys(utils).forEach(key => { global[key] = utils[key]; });
内容的提问来源于stack exchange,提问作者Danii
相关产品推荐
相关产品推荐

