从函数返回函数的目的是什么?

时间:2015-08-11 23:34:16

标签: javascript

阅读一些遗留代码,找到了

A.prototype.setSize: function () {
   var v1 = new Vector2();
   return function (size ) {

     var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
     this.min.sub( halfSize );
     return this;

   };

}(),

我想知道:

  1. 为什么将setSize定义为返回另一个函数的函数
  2. 此外,定义的功能也会立即执行。
  3. 有什么亮点可以解决这个问题吗?

    更新:

    我可以简单地使用

       A.prototype.setSize: function (size) {
           var v1 = new Vector2();
    
           var halfSize = v1.copy( size ).multiplyScalar( 0.5 );
           this.min.sub( halfSize );
           return this;
    
        },
    

    第一个片段比第二个好吗?

4 个答案:

答案 0 :(得分:5)

  1. 因此,每次调用时,返回的函数都可以访问v1的值,而不会使v1成为全局(或非私有)
  2. 这样就将返回的函数分配给setSize

答案 1 :(得分:2)

该特定情况的目的是避免每次调用Vector时创建新的setSize对象。这是一种缓存策略。另一种方法是只具有平面功能:

A.prototype.setSize: function (size) {
  var v1 = new Vector2();
  var halfSize = v1.copy(size).multiplyScalar(0.5);
  this.min.sub(halfSize);
  return this;
}

如果因为setSize发现我遇到了性能问题,我只会使用new Vector2()的闭包缓存版本。

答案 2 :(得分:2)

一个典型的例子是:

function createAdder(x) {
  return function add(y) {
    return x + y;
  }
}

var addTwo = createAdder(2);
// addTwo is a function that takes one input and adds 2 to it
addTwo(3); // 5
addTwo(9); // 11

这个想法是你想要创建一个函数,但你想要创建的函数取决于某些东西。在这种情况下,我们想要创建一个addX函数。

有关详情,请参阅Chapter 5 of Eloquent Javascript。特别是Higher Order Functions部分。

它也可能更干。考虑:

function createSecretAdder() {
  var secretNumber = generateSecretNumber(); // THIS TAKES A LONG TIME
  return function(n) {
    return secretNumber + n;
  }
}
var secretAdder = createSecretAdder(); // slow
secretAdder(2); // fast
secretAdder(7); // fast

VS

function createSecretAdder() {
  return function(n) {
    var secret = getSecretNumber(); // THIS TAKES A LONG TIME
    return secretNumber + n;
  }
}
var secretAdder = createSecretAdder(); // fast
secretAdder(2); // slow
secretAdder(7); // slow

前者是DRYer,比后者更快。这应该解决您的comment以及您问题的更新。

注意:您必须了解closures以了解这些内容是如何运作的。

至于为什么会立即调用它,请参阅here

答案 3 :(得分:2)

它功能关闭。用于隐藏全局范围内的变量。请继续阅读并查看此处的一些示例

JS function closures