我知道让函数返回其他函数有时候很方便,这样你就不必重复自己,增加模块性等。
但是,three.js库中的这个片段(其中一个)的重点是什么?
Object.assign( Matrix4.prototype, {
...
applyToBufferAttribute: function () {
var v1 = new Vector3();
return function applyToBufferAttribute( attribute ) {
for ( var i = 0, l = attribute.count; i < l; i ++ ) {
v1.x = attribute.getX( i );
v1.y = attribute.getY( i );
v1.z = attribute.getZ( i );
v1.applyMatrix4( this );
attribute.setXYZ( i, v1.x, v1.y, v1.z );
}
return attribute;
};
}(),
...
} );
'内联'applyToBufferAttribute
不会在其他任何地方重复使用。
答案 0 :(得分:1)
返回的函数成为方法,是的。将它包装到IIFE中的目的是隐藏v1
变量,使其成为C所谓的“静态变量”:无论你做了多少Matrix4
个对象,无论你调用多少次applyToBufferAttribute
,只有v1
的一个实例,除了applyToBufferAttribute
函数内部之外,它将无法访问。
的目的,我们只能猜测,但可能会避免该Vector3
个对象的分配和解除分配成本,假设applyToBufferAttribute
以某种频率被调用。鉴于three.js是一个WebGL库,每一点优化都有帮助。
答案 1 :(得分:0)
这就是你&#34;隐藏&#34;外部范围的变量。
v1
在您的模块之外不再可见,您确保没有人会篡改它。
通常,return函数是一个闭合v1
变量的闭包。
另一种方法是制作一个完整的誓言对象并使v1
只读,但你经常不会费心去做这样的对象。所以它是一种快速方便的方法来封装一些变量。
第二种选择是将v1
添加到返回对象。
function applyToBufferAttribute() {
if (!this.v1) {
this.v1 = new Vector3();
}
...
}
但是这也存在让v1
在外面可见并使代码更脆弱的问题。