阅读一些遗留代码,找到了
A.prototype.setSize: function () {
var v1 = new Vector2();
return function (size ) {
var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
this.min.sub( halfSize );
return this;
};
}(),
我想知道:
有什么亮点可以解决这个问题吗?
更新:
我可以简单地使用
A.prototype.setSize: function (size) {
var v1 = new Vector2();
var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
this.min.sub( halfSize );
return this;
},
第一个片段比第二个好吗?
答案 0 :(得分:5)
v1
的值,而不会使v1
成为全局(或非私有)setSize
答案 1 :(得分:2)
该特定情况的目的是避免每次调用Vector
时创建新的setSize
对象。这是一种缓存策略。另一种方法是只具有平面功能:
A.prototype.setSize: function (size) {
var v1 = new Vector2();
var halfSize = v1.copy(size).multiplyScalar(0.5);
this.min.sub(halfSize);
return this;
}
如果因为setSize
发现我遇到了性能问题,我只会使用new Vector2()
的闭包缓存版本。
答案 2 :(得分:2)
一个典型的例子是:
function createAdder(x) {
return function add(y) {
return x + y;
}
}
var addTwo = createAdder(2);
// addTwo is a function that takes one input and adds 2 to it
addTwo(3); // 5
addTwo(9); // 11
这个想法是你想要创建一个函数,但你想要创建的函数取决于某些东西。在这种情况下,我们想要创建一个addX
函数。
有关详情,请参阅Chapter 5 of Eloquent Javascript。特别是Higher Order Functions部分。
它也可能更干。考虑:
function createSecretAdder() {
var secretNumber = generateSecretNumber(); // THIS TAKES A LONG TIME
return function(n) {
return secretNumber + n;
}
}
var secretAdder = createSecretAdder(); // slow
secretAdder(2); // fast
secretAdder(7); // fast
VS
function createSecretAdder() {
return function(n) {
var secret = getSecretNumber(); // THIS TAKES A LONG TIME
return secretNumber + n;
}
}
var secretAdder = createSecretAdder(); // fast
secretAdder(2); // slow
secretAdder(7); // slow
前者是DRYer,比后者更快。这应该解决您的comment以及您问题的更新。
注意:您必须了解closures以了解这些内容是如何运作的。
至于为什么会立即调用它,请参阅here。
答案 3 :(得分:2)
它功能关闭。用于隐藏全局范围内的变量。请继续阅读并查看此处的一些示例