2013-10-09 41 views
0

我一直在尋找一些舊的代碼在工作,我發現了幾個嵌套循環的實例,其中用於迭代對象的變量在內部循環內被重新分配,但它不會引起問題。比如給出下面的example.cfm爲什麼在嵌套循環中重複使用迭代器變量不會導致ColdFusion中的問題?

<cfscript> 

    // Get every second value in an array of arrays 
    function contrivedExampleFunction(required array data) { 
     var filtered = []; 

     for (i = 1; i lte arrayLen(arguments.data); i++) { 
      var inner = arguments.data[i]; 

      for (i = 1; i lte arrayLen(inner); i++) { 
       if (i eq 2) { 
        arrayAppend(filtered, inner); 
       } 
      } 
     } 

     return filtered; 
    } 

    data = [ 
     [1,2,3], 
     [4,5,6], 
     [7,8,9] 
    ]; 

    // Expected (working function): [2, 5, 8] 
    // Expected (short-circuiting): [2] 
    // Actual result: [1, 2, 3] 
    writeDump(contrivedExampleFunction(data)); 

</cfscript> 

我希望內i聲明重新分配外i並導致功能「短路」,尤其是i甚至沒有作用域。但是該函數將返回一個不可預知的結果。爲什麼?

回答

6

你沒有正確地檢查代碼。這是錯誤的,但它按預期工作。

The outer loop will loop i from 1-3 
    First iteration i=1 
    inner = data[1] => [1,2,3] 
    The inner loop will loop i from 1-3 
     First iteration i=1 
      nothing to do 
     Second iteration i=2 
      append inner to filtered => [1,2,3] 
     Third iteration i=3 
      nothing to do 
    end inner loop 
    i=3, which meets the exit condition of the outer loop 
end of outer loop 

filtered = [1,2,3] 

我想你是誤讀這行代碼:

arrayAppend(filtered, inner); 

你讀它:

arrayAppend(filtered, inner[i]); 

但它沒有說。

有意義嗎?

+0

好地方!我在一個代碼庫中發現了幾個實例,內部循環將重新分配外部迭代變量(既沒有作用域),這對我來說也有些困擾。我想現在我有一個很好的例子,說明爲什麼*不*要做到這一點(除了瘋狂之外),而不是我認爲我有的奇怪CF行爲的例子。 –

+1

如有疑問,請查看您的數據。像writeoutput這樣的行(「在內部循環之前我是#i#」)非常方便。 –

相關問題