如何在不修改插件代码的情况下访问IIFE内部的变量与函数?
关于IIFE内部变量/函数的访问问题
Great question! Let's break this down step by step.
为什么你无法访问someVar和someFunc?
你写的这段代码用了立即执行函数表达式(IIFE),这种写法的核心目的就是创建一个私有作用域——里面定义的someVar和someFunc都是这个作用域内的局部变量/函数,而且你的IIFE没有返回任何值,也没有把它们挂载到外部对象上,所以这些成员完全被封装在私有作用域里,外部无法直接访问。
更直白点说:你的exitPopup变量实际上是undefined(因为IIFE没有返回值),自然没法通过exitPopup.someFunc()来调用内部函数。
不修改原插件代码的话,能调用someFunc吗?
很遗憾,正常情况下是做不到的。因为这些成员被完全隔离在IIFE的私有作用域中,外部没有任何引用指向它们。
不过如果doSomething()是全局函数的话,你可以直接调用doSomething()来达到类似的效果,但这并不是调用someFunc本身。
如果允许修改原代码,怎么让外部能调用someFunc?
如果可以调整原插件代码,最简单的方式是把需要暴露的成员通过返回值导出:
var exitPopup = (function($) { var someVar = false; var someFunc = function() { doSomething(); }; // 暴露需要外部访问的成员 return { someFunc: someFunc }; })(jQuery); // 现在就能正常调用了 exitPopup.someFunc();
另一种方式是把someFunc挂载到全局对象上(不推荐,容易污染全局命名空间):
var exitPopup = (function($) { var someVar = false; // 挂载到window全局对象 window.someFunc = function() { doSomething(); }; })(jQuery); // 外部直接调用 someFunc();
内容的提问来源于stack exchange,提问作者Nick Rolando
相关产品推荐
相关产品推荐

