使用私有/公共方法的高效Javascript模块模式

使用私有/公共方法的高效Javascript模块模式,javascript,performance,module,closures,Javascript,Performance,Module,Closures,我正在探索编写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(se

我正在探索编写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");}); //我的自由 var MyModule=函数(回调){ var计数=0; main();//在我看来很难看 //我想公开。 函数main(){ 计数++; window.specialApi.doWorkAndCallback(秘密); //… } //我想保密 //它需要访问计数器变量(#闭包) 函数秘密(){ 如果(计数==2){ 回调(); } } //私人职能 //其他私人职能 //… }; //以后其他任何人都可以使用MyModule。 MyModule(函数(){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();

“JS虚拟机将重新解释整个功能列表”-你怎么知道的?这是我自己的理解,我没有用任何方法来衡量它。也许我错了。现代JavaScript运行时系统以非常复杂的方式处理代码。通常,除非遇到真正的性能问题,否则担心这些事情是没有意义的。然后是时候打开一个代码分析器了。@Pointy当我们有很多方法和模块,并且整个未压缩的js文件的重量超过130KB,并且它针对的是移动平台时,您的响应是否有效?是的,它是有效的。性能问题通常涉及错误的算法和/或过度浪费的DOM操作。如果在第一个window.specialApi.doWorkAndCallback尚未完成时设置第二个modul.callback,则会导致性能问题中断。因为,当window.specialApi.doWorkAndCallback完成时,它将调用第二个回调,而不是第一个回调。很好的尝试,但我不需要保留count的旧值。除此之外,您的代码看起来与我的代码非常接近(除了您为我使用函数表达式与函数声明)
  //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();