使用私有/公共方法的高效Javascript模块模式
我正在探索编写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”);});使用私有/公共方法的高效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
我在这里发现的问题是,每次调用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();