我刚刚阅读了这篇文章http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/。
在标题为"#4添加缓存"它说:
通过在mixins周围形成一个闭包,我们可以缓存初始定义运行的结果,并且性能影响非常明显。
我不明白这是如何工作的 - 在这里使用模块模式如何导致更快/缓存的代码版本?
答案 0 :(得分:2)
基本上,不使用闭包,每次都会创建mixin函数 使用mixin的时间。通过创建一个闭包,每个函数都将是 创建一次,mixin将每次引用这些函数 调用。因为mixin不必每次都重新创建这些函数 跑步,速度更快。
没有关闭
var asRectangle = function() {
// every time this function is called, these three functions are created
// from scratch, slowing down execution time
this.area = function() {
return this.length * this.width;
}
this.grow = function() {
this.length++, this.width++;
}
this.shrink = function() {
this.length--, this.width--;
}
})();
关闭
var asRectangle = (function() {
// these functions are 'cached' in the closure
function area() {
return this.length * this.width;
}
function grow() {
this.length++, this.width++;
}
function shrink() {
this.length--, this.width--;
}
// this function is set to asRectangle. it references the above functions
// every time it is called without having to create new ones
return function() {
this.area = area;
this.grow = grow;
this.shrink = shrink;
return this;
};
})();
答案 1 :(得分:1)
它不是闭包或模块模式,而是它的结果:不同的构造函数/ mixin函数。而
function mixin() {
this.method = function() { ... }
}
为每个调用创建方法的新闭包范围(mixin
的执行上下文,它不包含变量 - 但需要在内存中保留)
function method() { ... }
function mixin() {
this.method = method;
}
仅创建一个仅存在于一个范围内的函数(多次应用时)。
模块模式仅用于使method
成为局部变量。
答案 2 :(得分:0)
在第二种情况下,只执行此代码:应用mixin:
this.area = area;
this.grow = grow;
this.shrink = shrink;
return this;
在第一种情况下,area
,grow
和shrink
被重新定义为每次asXXX
次呼叫。方法的定义及其缓存是在第二种情况下在mixin声明的“解析”时完成的,因此只需要进行一次。