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

When can a function be only called once?

本文关键字:一次 调用 函数 什么时候      更新时间:2023-09-26

这个问题给我带来了麻烦:

编写一个函数,一次(请参见: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();
        } 
    };
};

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

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

演示:Fiddle

您的路径几乎是正确的,但您也可以存储返回值,传递参数并提供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