我想知道最好的方法是检查函数中是否已经调用了一个参数。
我想做的Sudo代码:
function returnArg(arg){
if(argHasbeenCalled){
return "foo";
}
else{
return arg;
}
}
我的解决方案是:
var myArray = [];
function returnFoo(arg){
if(jQuery.inArray(arg, myArray) < 1){
return "Foo";
}
else {
return "bar";
}
newArray.push(arg);
}
答案 0 :(得分:2)
在将参数存储在数组中之前,您的代码将返回。
除非你点击else分支,否则你不需要在数组中存储参数。所以考虑这样的事情:
var myArray = [];
function returnFoo(arg)
{
if (jQuery.inArray(arg, myArray) === -1)
{
return "Foo";
}
else
{
myArray.push(arg);
return "bar";
}
}
答案 1 :(得分:2)
一个简单的解决方案是:
// generic helper function
function rememberCalls(fn) {
var calledArgs = {};
return function(arg) {
if (!(arg in calledArgs)) {
calledArgs[arg] = fn(arg);
}
return calledArgs[arg];
}
}
// example
var addQuestionMark = rememberCalls(function(str) {
return str + '?';
});
addQuestionMark('What is your name'); // the function will be called
addQuestionMark('What is your name'); // the function will be skipped
答案 2 :(得分:1)
我认为你想要的是memoization。如果您只是想知道参数是否曾被处理过,那么它与您对结果不感兴趣并不完全相同,但您可以使用类似的方法。
var myFn = (function (processedArgs) {
return function (arg) {
if (processedArgs[arg]) {
console.log('already processed');
//do something
return;
}
console.log('not processed');
//do something
processedArgs[arg] = true;
};
})({});
myFn(1); //not processed
myFn(1); //already processed
但是,如果arg
是一个对象,则必须使用该对象的某些属性才能使其生成密钥。如果不可能,您可以将它们存储在数组中,而不是将对象用作映射,并使用array.indexOf(arg)
查看对象是否在数组中。