簡體   English   中英

具有私有/公共方法的高效Javascript模塊模式

[英]Efficient Javascript Module pattern with private/public methods

我正在探索在考慮性能的情況下編寫Javascript模塊的方法。

//My lib
var MyModule = function(callback){
    var count = 0;

    main();    //ugly in my opinion

    //Function I want to be public.
    function main(){
        count ++;
        window.specialApi.doWorkAndCallback(secret);
        //…
    }

    //Function I want to keep private
    //It needs to access to counter variable (#closure)
    function secret(){
        if(count === 2){
            callback();
        } 
    }

    //private function 
    //other private function
    //…
};


//Later anyone else can use MyModule.
MyModule(function(){console.log("ok");});

我在這里發現的問題是,每次調用MyModule()時,JS VM都會重新解釋整個函數列表,這不利於性能。

有沒有一種模式可以讓我執行以下操作:

  • 公開主要功能。
  • 秘密功能保密。 請注意可能會使任務變硬的計數器變量。
  • 僅解析一次MyModule

謝謝

以下函數創建並返回一個對象,該對象僅包含main方法:

var MyModule = function(callback){
    var count = 0;

    var secret = function(){
        if(count === 2){
            callback();
        } 
    }

    var main = function(){
        count ++;
        window.specialApi.doWorkAndCallback(secret);
    }

    main();

    return {
        main: main
    };
};

然后,您唯一要做的就是調用一次此函數並將其返回值存儲在變量中:

var module = MyModule(function(){console.log('ok');});

最后,每當您要調用main (並保留count的舊值)時,只需執行以下操作:

module.main();
  //My lib
    var modul =  
        {
        count:0,
        callback:{},
        main: function(){
           this.count ++;                        
            window.specialApi.doWorkAndCallback(this.secret);     
        },
        secret: function(){
            if(this.count === 2){
              this.callback();
            } 
        }
    };


    modul.callback = function(){console.log("ok");};
    modul.main();

    modul.callback = function(){console.log("ok");};
    modul.main();

    modul.callback = function(){console.log("ok");};
    modul.main();

    modul.callback = function(){console.log("ok");};
    modul.main();

http://jsbin.com/emitoj/3/edit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM