JS中如何让f2()访问其他词法作用域内的内部函数f1()?
解决方案:让外部回调访问私有函数f1
根据你给出的代码,f1是factory闭包内的私有函数,外部传给m.f2的回调处于全局作用域,受词法作用域限制无法直接访问f1。以下是几种可行的实现方法:
方法1:将f1暴露到exports对象
直接把f1挂载到exports(也就是global.m)上,让外部可以直接引用:
(function(global, factory) { global.m = {}; factory(global.m); })(this, (function(exports) { function f1() { return "f1"; }; function f2(f) { return f.call(null, "f2"); }; exports.f2 = f2; exports.f1 = f1; // 暴露f1到外部对象 })) m.f2(function(a) { return a + m.f1() // 通过m访问f1 })
方法2:通过f2传递f1的引用
利用闭包特性,在f2内部将f1作为额外参数传给回调函数:
(function(global, factory) { global.m = {}; factory(global.m); })(this, (function(exports) { function f1() { return "f1"; }; function f2(f) { // 调用回调时传入f1的引用 return f.call(null, "f2", f1); }; exports.f2 = f2; })) m.f2(function(a, f1) { return a + f1() // 使用传入的f1执行调用 })
方法3:让回调处于f1的词法作用域内
如果允许回调定义在factory内部,它自然能直接访问f1:
(function(global, factory) { global.m = {}; factory(global.m); })(this, (function(exports) { function f1() { return "f1"; }; function f2(f) { return f.call(null, "f2"); }; exports.f2 = f2; // 在factory内部定义回调,直接访问f1 exports.runTest = function() { return f2(function(a) { return a + f1(); }); }; })) m.runTest(); // 执行测试逻辑
这几种方法都基于词法作用域和闭包的核心逻辑:要么让外部能拿到f1的引用,要么让回调处于f1的作用域链中。
内容的提问来源于stack exchange,提问作者Dmitry Perfilyev
相关产品推荐
相关产品推荐

