函数返回函数作为属性

时间:2017-09-21 08:49:48

标签: javascript

我知道让函数返回其他函数有时候很方便,这样你就不必重复自己,增加模块性等。
但是,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不会在其他任何地方重复使用。

2 个答案:

答案 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在外面可见并使代码更脆弱的问题。