函数定义中自调用函数的优点

时间:2016-10-18 12:14:18

标签: javascript function three.js

这样的函数定义的优点是什么: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 ) );

    };

}(),

那么这种定义函数的方式是什么原因?

2 个答案:

答案 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只被实例化一次。

实现的构造称为“闭包”。