如何从外部文件调用exports.run()内部定义的foo函数?
能不能调用这类藏在函数内部的私有函数?
哎,这个问题我太懂了!先给你个明确答案:能调用,但真心不推荐这么做——毕竟foo是run函数局部作用域里的私有函数,从设计上来说就不该暴露给外部调用。下面分两种情况给你讲清楚:
一、最稳妥的正确姿势:修改原文件暴露函数
如果你能改something.js,那直接调整代码把foo露出来才是正途,有两种常见方式:
方式1:直接把foo导出
修改something.js:
// 先定义foo function foo() { console.log("foo"); } // 原来的run函数可以正常调用foo exports.run = (args) => { foo(); } // 把foo也导出给外部用 exports.foo = foo;
然后在调用的文件里就可以直接用了:
const something = require("./something.js"); module.exports = { callFoo: function() { something.foo(); // 这下完全没问题啦 } }
方式2:让run函数返回foo(适合依赖内部状态的情况)
如果foo的逻辑需要用到run函数里的参数或者内部变量,那可以让run执行后把foo返回出来:
exports.run = (args) => { function foo() { console.log("foo收到的参数:", args); } // 把foo返回给调用者 return foo; }
调用的时候就这么写:
const something = require("./something.js"); module.exports = { callFoo: function() { // 先调用run拿到foo函数 const foo = something.run("hello"); foo(); // 会输出 "foo收到的参数:hello" } }
二、极端情况的hack玩法(仅作了解,别用在生产!)
要是你完全碰不了something.js,那也有歪招——但真的非常脆弱,代码格式一变就失效,还存在安全风险,纯粹是应急用的:
const something = require("./something.js"); module.exports = { callFoo: function() { // 把run函数转成字符串源码 const runCode = something.run.toString(); // 用正则扒出foo函数的内容(只适配你现在的代码格式) const fooCodeMatch = runCode.match(/function foo\(\) \{([\s\S]+?)\}/); if (fooCodeMatch) { // 用Function构造器创建foo函数 const foo = new Function(fooCodeMatch[1]); foo(); // 能输出"foo",但全靠代码格式不变 } } }
再次提醒:这种方法千万别在正经项目里用! 破坏封装性不说,后续原代码只要改个换行、加个注释,正则就匹配不上了,维护起来能把人逼疯。
内容的提问来源于stack exchange,提问作者omnomnom
相关产品推荐
相关产品推荐

