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

时间:2017-11-18 14:38:44

标签: 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();
}

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

2 个答案:

答案 0 :(得分:1)

首先,您似乎对jQuery如何编写使用的方式感到困惑。 $(function () { })使用 jQuery的一种方式(并且它不是IIFE,BTW)。

其次,jQuery是可访问的,因为它将$jQuery(它们都指向相同的东西)分配给window。它的所有方法都是$对象的属性。

你可以做同样的事情:



(function() {
  'use strict';

  function aa() {
    alert();
    console.log('a');
    return 1;
  }

  function ab() {
    return 2;
  }

  window.myStuff = {
    aa: aa,
    ab: ab
  };
})();

(function() {

  function b() {
    var sum = myStuff.aa() + myStuff.ab();

    console.log(sum);
  }

  b();

})();




答案 1 :(得分:0)

IIFE是与其他任何功能相同的功能。这意味着您可以像在任何其他函数中一样将参数传递给IIFE,例如:

(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中,window变量是全局它是一个对象。罗,看哪:

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

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

所以,要点是传入一个对象,然后在IIFE中修改对象。