什么时候只能调用一次函数?

时间:2015-03-02 08:01:10

标签: javascript

这个问题让我很麻烦:

  

写一个函数,一次,(参见:http://underscorejs.org/#once)   接受一个函数并返回该函数的一个版本,该版本只能   被召唤一次。 [提示:你需要关闭]你可能不想   可以对某人的信用卡加倍收费。这是一个例子   如何使用它:

  var chargeCreditCard = function(num, price){
    //charges credit card for a certain price
  };
  var processPaymentOnce = once(chargeCreditCard);


  processPaymentOnce(123456789012, 200);

以下是我试图解决的问题:

var once = function(func) {
    var invoked = 0;
    return function() {
        if (invoked === 0) {
            invoked++;
            return func();
        } 
    };
};

2 个答案:

答案 0 :(得分:1)

我能看到的唯一问题是你没有将参数传递给被调用的函数。您可以使用arguments对象和Function.apply()来执行此操作。

var once = function (func) {
    var invoked = 0;
    return function () {
        if (invoked === 0) {
            invoked++;
            return func.apply(this, arguments);
        }
    };
};

演示:Fiddle

答案 1 :(得分:1)

您几乎是在正确的道路上,但您也可以存储返回值,传递参数并提供this上下文:

function once(func) {
  var val,
    count = 2;
  return function () {
    if (--count > 0) {
      val = func.apply(this, arguments);
    } else {
      //performance concern
      func = null;
    }
    return val;
  };
}

这是我借用lodash在我的代码库中使用的。

同样值得注意的是,将count变量作为参数传递也可以让我们以func调用小于count次的方式使用它