2012-12-04 50 views
1

Possible Duplicate:
Javascript infamous Loop problem?Javascript - 閉包 - 詞法作用域 - 如何在嵌套函數中包含循環變量數據?

我有以下代碼:

function test() { 

    var columns = options.columns; 

for (var i =0; i < columns.length; i++) { 
    if (columns[i].type === "number") { 
     var field = columns[i].field; 
     columns[i].footerTemplate = function(data) { return buildFooter(data, field);  }; 
     } 
    } 
} 

function buildFooter(data, field) { 
    alert(field); 
} 

庫函數調用footerTemplate功能(這反過來又調用buildFooter)。在buildFooter警報指出領域始終是相同的值(最後一個值迭代中測試的循環。)如何能buildFooter與適當的字段值稱爲(即

columns[0].footerTemplate = function(data) { return buildFooter(data, columns[0].field);} 

columns[1].footerTemplate = function(data) { return buildFooter(data, columns[1].field);} 

等等...

+0

請拿出一個更好的標題。除了簡單地重新提出問題標籤之外的其他內容。 – j08691

+0

對不起。我編輯了一個更好的標題。我的意思是在首次發佈之前更好地描述。 – James

回答

2

嘗試:

columns[i].footerTemplate = (function(field) { 
    return function (data) { 
     buildFooter(data, field); 
    }; 
})(field); 

它立即執行復該函數返回一個新的函數,該函數具有正確綁定的變量field。這絕對是一個範圍問題,它是循環的一個問題,所以使用一個立即調用的函數來創建一個新的範圍並且提供正確的變量。這絕對是Javascript infamous Loop issue?的副本,雖然

+0

在他的原始代碼中,'footerTemplate'是一個函數。你現在已經執行了這個函數,並將'footerTemplate'設置爲結果。這不是一回事。 – bhamlin

+0

@bhamlin是的,也注意到了,正在編輯中。當它被格式化(一行) – Ian

+0

謝謝你很難實現(當我原本打算做我已經改變它的東西)。 Firebug報告數據未定義。注意:數據未定義封閉函數。 – James

4

JavaScript不會在邏輯塊(循環,ifs)內部限定變量。 field變量在所有footerTemplate屬性中共享。

您可以通過創建一個內聯函數解決這個問題創造一些範圍:

for (var i =0; i < columns.length; i++) { 
    if (columns[i].type === "number") { 
     (function() { 
      var field = columns[i].field; 
      columns[i].footerTemplate = function(data) { 
      return buildFooter(data, field); 
      }; 
     })(); 
    } 
    } 
} 
+0

我不知道爲什麼,但我得到一個錯誤,當我嘗試這一點。 Firebug狀態SyntaxError:在嘗試上面的代碼時,函數語句需要一個名稱。 – James

+0

我錯過了該函數的括號,謝謝@ 4lbertoC用於糾正它。 – bhamlin

+0

明白了。這是有效的,是有道理的。謝謝你的幫助。 @ 4lbertoC - 感謝編輯。 – James

0

JavaScript是功能範圍的語言,所以你

field 

變量decleration的for循環裏面與你在foor循環之外聲明它相同,你只是一遍又一遍地覆蓋相同的變量,每個循環都沒有爲字段變量分配內存,這是正在寫入的同一個內存空間。

相關問題