Javascript js插件如何使IIFE中的函数可访问?

Javascript js插件如何使IIFE中的函数可访问?,javascript,Javascript,例如,jQuery的代码以(function(){)开头,因此它的函数不应该从外部文件访问,但它们如何使它们可以访问? 我试着创建1.js,2.js,下面是1.js的代码 (function(){ 'use strict'; function aa(){ alert(); console.log('a'); return 1; } })(); 和2.js function b(){ aa(); } 现在,当我运行

例如,jQuery的代码以
(function(){
)开头,因此它的函数不应该从外部文件访问,但它们如何使它们可以访问? 我试着创建
1.js,2.js
,下面是1.js的代码

(function(){
    'use strict';
    function aa(){
        alert();
        console.log('a');
        return 1;
    }
})();
和2.js

function b(){
    aa();
}

现在,当我运行
b()
时,它返回一个错误,即未找到
aa()
,即使我将它们都添加到HTML文件中。

首先,您似乎对jQuery的编写方式和使用方式感到困惑。
$(函数(){})
是使用jQuery的一种方式(顺便说一句,它不是IIFE)

其次,jQuery是可访问的,因为它将
$
jQuery
(两者都指同一事物)分配给
窗口
。它的所有方法都是
$
对象上的属性

您可以做同样的事情:

(函数(){
"严格使用",;
函数aa(){
警惕();
console.log('a');
返回1;
}
函数ab(){
返回2;
}
window.myStuff={
aa:aa,
ab:ab
};
})();
(功能(){
函数b(){
var sum=myStuff.aa()+myStuff.ab();
控制台日志(总和);
}
b();

})();
IIFEs与任何其他函数一样都是函数。这意味着您可以像在任何其他函数中一样将参数传递到IIFEs,例如:

(function(num) { console.log(num * 2); })(3); // logs 6
但您也可以传入对象,而不是像上面那样传入数字:

(function(obj) {
    console.log(obj.foo + 1); // logs 124
})({ foo: 123 });
由于可以传递对象,因此也可以传递指向对象的变量:

var outsideObj = { foo: 123 };

(function(insideObj) {
    insideObj.foo = insideObj.foo + 1;
})(outsideObj);

console.log(outsideObj.foo); // logs 124
请记住,在JavaScript中,
窗口
变量是一个全局变量,是一个对象。瞧:

(function(insideObj) {
    insideObj.example = function() {
        console.log('example called');
    };
})(window);

window.example(); // logs 'example called'

因此,要点是传入一个对象,然后在IIFE中修改该对象。

jQuery和其他库对
window
@Pointy的属性进行显式赋值。我该怎么做?谢谢您的解释!