如何在使用";立即调用的函数表达式;用Javascript?

如何在使用";立即调用的函数表达式;用Javascript?,javascript,javascript-namespaces,Javascript,Javascript Namespaces,我一直在用这种方式定义名称空间 (function( skillet, $, undefined ) { //Private Property var isHot = true; //Public Property skillet.ingredient = "Bacon Strips"; //Public Method skillet.fry = function() { var oliveOil; addItem( "\t\n Butter \n\t" ); ad

我一直在用这种方式定义名称空间

(function( skillet, $, undefined ) {
//Private Property
var isHot = true;

//Public Property
skillet.ingredient = "Bacon Strips";

//Public Method
skillet.fry = function() {
    var oliveOil;

    addItem( "\t\n Butter \n\t" );
    addItem( oliveOil );
    console.log( "Frying " + skillet.ingredient );
};

//Private Method
function addItem( item ) {
    if ( item !== undefined ) {
        console.log( "Adding " + $.trim(item) );
    }
}    
}( window.skillet = window.skillet || {}, jQuery ));
现在,我想将skillet扩展到一个子名称空间,如skillet.module,并让模块以与skillet相同的方式运行—保护其未定义的成员,并允许私有和公共成员


我尝试了另一种定义名称空间的方法,在skillet内部,do skillet.theObject={blah:function(){};依此类推,但这只会给我一个普通对象,而不是其中的私有和公共成员。

只需在函数中添加另一个立即调用的函数表达式,并向其传递赋值参数,以便对其进行初始化

(function (skillet, $, undefined) {
    //Private Property
    var isHot = true;

    //Public Property
    skillet.ingredient = "Bacon Strips";

    //Public Method
    skillet.fry = function () {
        var oliveOil;

        addItem("\t\n Butter \n\t");
        addItem(oliveOil);
        console.log("Frying " + skillet.ingredient);
    };

    (function (module) {
        module.test = function () { // access this by typing skillet.module1.test()
            if (isHot !== undefined) console.log(pour('water') + (isHot ? ', cold!' : ', hot!'));
        }

        function pour(what) {
            return 'Pouring ' + what;
        }
    )(skillet.module1 || (skillet.module1 = {})); // no need for undefined and $ rewriting as already done in parent function


    //Private Method
    function addItem(item) {
        if (item !== undefined) console.log("Adding " + $.trim(item));
    }    
}(window.skillet || (window.skillet = {}), jQuery));

JavaScript中并没有真正的名称空间:JavaScript中的所有“名称空间”实际上都是对象。我相信他知道这一点,但他只是试图在JavaScript中包含OOP实践,这是正确的=)@Qantas94Heavy是的,这就是我想要的。你能把这个作为一个答案,这样我就可以接受了吗?谢谢,我添加了一个保护,skillet.module=skillet.module |{},就像顶部的名称空间一样。