2011-02-11 99 views
2

我有一個調用匿名函數並將變量作爲參數傳遞的問題。如果我在將一個匿名函數作爲參數傳遞給一個數組之後將其保存到一個數組中,那麼我會更改該變量並調用該函數,它將輸出該變量的最後一個值,而不是當前推送匿名函數時該變量的值進入我的陣列。 我簡化我的代碼在下面的例子:JS將參數作爲變量傳遞給匿名函數,稍後調用它 - >參數值問題

var arr = []; 

function myFunction(index) { 
    alert(index); 
} 

function doPush() { 
    var k = 'hello'; 

    var f = function(){myFunction(k);}; 

    arr.push(f); 

    k = 'goodbye'; 
} 

function invoker(op) { 
    op(); 
} 

function invokePushed() { 
    invoker(arr[0]); 
} 

doPush(); 
invokePushed(); 

那麼,invokePushed();警告'再見'而不是'你好'..我的目標是將數個函數存儲到數組中,並按順序調用它們,但這樣我的數組中的所有函數都具有相同(最後一個)參數值。

我知道我可以通過推動功能的字符串rappresentation到陣列解決這個問題:

var f = 'myFunction(\''+k+'\');'; 

,並在調用函數eval調用它,但我希望是使用第一種方法。

可能嗎?

謝謝,

亞歷山德羅。

回答

5

您必須創建一個新的範圍,其中捕獲當前值k。 JavaScript有唯一的功能範圍,所以你可以用立即功能做到這一點:

var f = (function(value) { 
    return function(){myFunction(value);}; 
}(k)); 

你能做出這樣更具可讀性通過創建一個命名函數生成的匿名函數:

function getFunction(value) { 
    return function(){myFunction(value);}; 
} 

// later 

var f = getFunction(k); 
+0

謝謝很多,這正是我正在尋找的。我只是通過這種方式改變了getFunction的通用性: 函數getFunction(f,value){ \t return function(){f.apply(null,value);}; } 問候,亞歷山德羅。 – 2011-02-11 09:51:19

相關問題