【问题标题】:Efficient Javascript Module pattern with private/public methods具有私有/公共方法的高效 Javascript 模块模式
【发布时间】:2013-05-30 16:09:25
【问题描述】:

我正在探索编写 Javascript 模块的方法,同时考虑到性能。

//我的库 var MyModule = 函数(回调){ 变量计数 = 0; 主要的(); //在我看来很丑 //我想要公开的函数。 函数主(){ 计数++; window.specialApi.doWorkAndCallback(秘密); //… } //我要保密的函数 //需要访问计数器变量(#closure) 函数秘密(){ 如果(计数 === 2){ 打回来(); } } //私有函数 //其他私有函数 //… }; //以后任何人都可以使用MyModule。 MyModule(function(){console.log("ok");});

我在这里发现的问题是每次调用 MyModule() 时,JS VM 都会重新解释整个函数列表,这对性能不利。

是否有一种模式可以让我执行以下操作:

  • 公开 ma​​in 函数。
  • secret 函数保密。请注意可能会强化任务的计数器变量。
  • 只解析一次 MyModule

谢谢

【问题讨论】:

  • “JS VM 将重新解释整个函数列表” - 你怎么知道?
  • 这是我自己的理解,反正我没有衡量。所以可能是我错了。
  • 现代 JavaScript 运行时系统以非常复杂的方式处理代码。一般来说,除非遇到真正的性能问题,否则担心这些事情是没有意义的。然后是时候分解代码分析器了。
  • @Pointy 在我们有很多方法和模块并且整个未压缩的 js 文件重量超过 130KB 并且针对移动平台时,您的回复是否有效?
  • 是的,它是有效的。性能问题通常涉及糟糕的算法和/或过度浪费的 DOM 操作。

标签: javascript performance module closures


【解决方案1】:

以下函数创建并返回一个对象,该对象仅包含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();

【讨论】:

  • 不错的尝试,但我不需要保留 count 的旧值。除此之外,您的代码看起来非常接近我的(除了您使用的是函数表达式与函数声明)
【解决方案2】:
  //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

【讨论】:

  • 如果您在第一个 window.specialApi.doWorkAndCallback 尚未完成时设置第二个 modul.callback,这将中断。因为,当 window.specialApi.doWorkAndCallback 完成时,它会调用第二个回调而不是第一个。
猜你喜欢
  • 2015-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多