2013-10-19 71 views
1

我想知道什么最好的方法是检查一个参数是否已被调用函数。什么我想要做检查参数是否已被使用

须藤代码:

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

是什么问题? –

+0

只是一个关于什么是检查参数是否被调用的最好方法的问题是。 –

+0

当函数已经处理了这个参数时,你想要做什么? – plalx

回答

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 
+0

这真的很棒!谢谢。很好地使用in运算符 –

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)来查看对象是否在数组中。

您也可以使用ObjectMap。不幸的是浏览器仍然不支持Map,但先前链接的答案会告诉你如何自己实现一个。

+0

谢谢Plalx。我没有听说过记忆,这看起来像一个很好的解决方案。 –

2

在将参数存储在数组中之前,您的代码将返回。

除非您点击else分支,否则不需要将参数存储在数组中。因此,考虑这样的事情:

var myArray = []; 
function returnFoo(arg) 
{ 
    if (jQuery.inArray(arg, myArray) === -1) 
    { 
    return "Foo"; 
    } 
    else 
    { 
    myArray.push(arg); 
    return "bar"; 
    } 
} 
+1

这种情况应该是$ .inArray(...)=== -1。 0是数组中的第一个元素。 http://api.jquery.com/jQuery.inArray/ – Warlock

+0

是的,现货。我没有看他的实际支票。现在编辑。 – struthersneil