2013-10-19 134 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