【问题标题】:Anvantage of self invoking function inside function definition函数定义中自调用函数的优点
【发布时间】:2017-02-27 17:05:47
【问题描述】:

这样的函数定义有什么好处: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 ) );

    };

}(),

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

【问题讨论】:

  • 考虑到dn的位置,anvantage有些错别字
  • 优点是隐藏quaternionapplyAxisAngle可以用,别人不行。

标签: javascript function three.js


【解决方案1】:

立即调用的函数表达式 (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 变量的值,在所有后续调用中重用该对象。

【讨论】:

    【解决方案2】:

    实际上,applyAxisAngle() 写成这样的原因并不是为了让quaternion 保持私有,尽管这实际上是实现的副作用。

    这样写是为了避免每次调用方法时都实例化new Quaternion(),从而避免垃圾回收。

    applyAxisAngle() 经常在紧密循环中被调用——每秒很多次。以这种方式编写方法,Quaternion 只被实例化一次。

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

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      相关资源
      最近更新 更多