这个问题让我很麻烦:
写一个函数,一次,(参见: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();
}
};
};
答案 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
次的方式使用它