它在下划线中用于_.once是什么用的?

时间:2014-01-16 15:35:09

标签: javascript underscore.js

我只是在underscore.js中看一下源的一次API,然后徘徊它用于什么 在方法中,它似乎无所作为:

func = null

来源:

  _.once = function(func) {
    var ran = false, memo;
    return function() {
      if (ran) return memo;
      ran = true;
      memo = func.apply(this, arguments);
      func = null;
      return memo;
    };
  };

4 个答案:

答案 0 :(得分:12)

可以在documentation

中找到该功能的功能
  

创建只能调用一次的函数版本。重复调用修改后的函数将无效,从原始调用返回值。对初始化函数很有用,而不是必须设置一个布尔标志,然后再检查它。

为什么在此commit message中解释了设置func = null

  

假设我们永远不会再在_.once()上运行包装函数,我们可以   将null赋给func变量,所以函数(以及它的所有继承   如果需要,GC可以收集范围。

答案 1 :(得分:3)

来自官方的underscorejs网站:

一次 _.once(功能)

创建只能调用一次的函数版本。重复调用修改后的函数将无效,从原始调用返回值。对初始化函数很有用,而不是必须设置一个布尔标志,然后再检查它。

var initialize = _.once(createApplication);
initialize();
initialize();
// Application is only created once.

http://underscorejs.org/#once

答案 2 :(得分:1)

目前还不清楚您是在询问整个功能还是只询问func = null行。如果是后者,请参阅下面的第3步。


ran最初是假的。

第一次运行返回的函数时:

  1. ran设置为true
  2. 传递给once的函数称为
  3. 删除了函数引用(可能是为了帮助垃圾回收)
  4. memo已退回
  5. 再次运行返回的函数时(因为ran现在是true):

    1. memo已退回

答案 3 :(得分:0)

另外值得指出的是,memo将保存最初执行的函数的结果。

因此,当您再次调用您的函数时,它将不会执行,但会返回第一个调用的结果。