这样的函数定义的优点是什么:obj = { func: function(){return function func(){return this.something;};}() }
故事: 我正在寻找一种方法如何围绕轴旋转一个Three.js Vector3一个角度,并发现: How to rotate a Three.js Vector3 around an axis? 我对该功能的工作方式感兴趣并进行查找:https://github.com/mrdoob/three.js/blob/master/src/math/Vector3.js。该函数如下所示:
applyAxisAngle: function () {
var quaternion;
return function applyAxisAngle( axis, angle ) {
if ( quaternion === undefined ) quaternion = new Quaternion();
return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
};
}(),
那么这种定义函数的方式是什么原因?
答案 0 :(得分:2)
立即调用的函数表达式(IIFE)允许该代码的作者为applyAxisAngle
函数提供一个真正的私有quaternion
变量,其他任何地方都无法看到。
该代码基本上是这样做的:
var quaternion;
// ...
applyAxisAngle: function applyAxisAngle( axis, angle ) {
if ( quaternion === undefined ) quaternion = new Quaternion();
return this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );
},
...但保持quaternion
完全私有,而不是与显示所有这些内容的代码共享。
它推迟构建Quaternion
对象,直到它第一次被调用,然后它通过使用该私有quaternion
变量中的值在所有后续调用中重用该对象。
答案 1 :(得分:2)
实际上,applyAxisAngle()
这样编写的原因并不是保持quaternion
私有,尽管事实上这是实施的副作用。
编写这种方式是为了避免每次调用方法时都实例化new Quaternion()
,从而避免垃圾回收。
applyAxisAngle()
通常被称为紧密循环 - 每秒多次。以这种方式编写方法,Quaternion
只被实例化一次。
实现的构造称为“闭包”。