自执行匿名函数和闭包

时间:2013-01-18 22:13:26

标签: javascript closures

信息

我正在尝试构建一个网站,我可以在其中包含某些文件,并使用不同的方法附加到我的全局变量,这些方法只会轻松添加到对象中。含义我只需要包含文件,此页面现在可以访问hutber对象中的所有内容。

核心hutber.js

var hutber = {};

(function ($) {
    "use strict"; //For good development standards :)

    hutber.init = function(){

    };
    hutber.init();
})(jQuery);

额外位hutber.form.js

(function ($) {
    "use strict"; //For good development standards :)

    hutber.form = {

    }

});

问题

我知道hutber在封闭内无法访问hutber.form。因此,如果不将这些功能从自动执行功能中删除,我如何才能hutber访问hutber.form? 或者这只是完全错误的方法来解决这个问题?

5 个答案:

答案 0 :(得分:4)

不可以访问hutber.form,因为hutber是全局的,但问题是时机问题。

如果init()在执行hutber.form函数之前运行,它将不存在。初始化无法运行到所有“加载项”都已加载。

附注:您的第二个将无法运行,因为它没有(jQuery);

(function ($) {
    "use strict"; //For good development standards :)

    hutber.form = {

    }

});  <-- missing  (jQuery); so it is not going to do anything

运行一个小小的演示,看看会发生什么。

var myObj = {};

(function(){

    myObj.init = function(){
        alert("init");
        try{ //will fail since bar has not loaded yet
        myObj.bar();
        } catch(e){ alert("failed calling bar"); }
    };
    //call init before bar is loaded
    myObj.init();
})();


(function(){

    myObj.bar = function(){
        alert("bar");
    };
})();

//call init after bar has been loaded
myObj.init();

jsFiddle of above code

当你运行它时,你会看到init在第一次调用时会失败,因为bar没有加载。第二次添加方法后它将起作用。因此,如果init依赖于加载的“模块”,它需要知道何时加载它们才能调用init方法。

答案 1 :(得分:1)

我想你想要这个:

<script src="hutber.js"></script>
<script src="hutber.form.js"></script>
<script> hutber.init(); </script>

答案 2 :(得分:0)

看看如何将hutber定义为全局变量,“form”属性肯定可以在任何立即调用的函数表达式中访问。

答案 3 :(得分:0)

你可能会以错误的方式看待这个问题。

不是说立即调用的函数是构建功能的错误方法......

然而,我所说的是,你有一个全局可用的对象,你可以在你的函数中直接引用它...

分配hutber.form = {};后,全局范围内的所有内容都可以完全访问hutber.form,因为hutber可以全局访问。

如果你这样做,那真的没有什么不同:

//form.js
hutber = hutber || {};
hutber.form = { /* ... */ };

在公众访问hutber.form方面。

闭包涵盖了你不返回的东西以及你没有分配给外部范围内的对象/数组/变量的东西。

因此,如果您在闭包内部有var mySecretIdentity = "Jerry O'Connell";,那么只有hutber.form内的方法才能访问mySecretItentity ...

...但是,你可以通过以下方式完成同样的事情:

// form.js
hutber = hutber || {};
hutber.form = (function () {
    var mySecretIdentity = "Jerry O'Connell";

    return {
        submit : function () {},
        clear  : function () {},
        validate : function () {}
    };
}());

现在任何私有都只能通过在闭包内写入的函数直接访问。

再说一次,它归结为:“你想解决什么问题?”

答案 4 :(得分:0)

{@ 1}}标签顺序非常重要,如@Sime Vidas所述。

按以下顺序执行:

<script>

我修改了jsFiddle中的脚本。你会注意到我喜欢使用window.variable来明确全局变量。我在核心hutber.js文件中的init函数立即触发,如果这是你想要的。

<script src="hutber.js"></script>
<script src="hutber.form.js"></script>