2014-01-22 59 views
1

我有一種情況,我正在編寫多個共享工作方法的函數,並且真的想重構和整理這些代碼,而不是讓這些相同的塊發生無數次只執行細微的差異。給定一個信息塊,我掃描每個條目並對該塊進行操作。複發性函數的一個例子是如下:函數內部的經常內聯函數?

function basicFunc() { 
     var totalX = 2000, totalY = 2000; 
     for (var y = 0; y < totalY; y++) { 
      for (var x = 0; x < totalX; x++) { 
        /* Fake operation for theory */ 
        var fakeVar = (y * x); 
      } 
     } 
    }; 

比較於:

function eachBlock(whatToDo, totalX, totalY) { 
     for (var y = 0; y < totalY; y++) { 
      for (var x = 0; x < totalX; x++) { 
       /* Fake operation for theory */ 
       return whatToDo; 

      } 
     } 
    }; 
    function basicFunc() { 
     var totalX = 2000, totalY = 2000; 
     eachoBlock("var fakeVar = (y * x)", totalX, totalY); 
    }; 

這工作正常的單線作爲whatToDo參數傳遞。你會如何去傳遞多條線路給eachBlock(),比方說如果你有一堆操作要做,而不是一個var FakeVar操作?

TLDR:如何在功能中使用函數調用來封裝它在成爲單獨函數之前執行的代碼操作的原始塊?

+1

順便說一下塊(例如函數體)後面不需要分號。 – Ryan

+0

爲什麼不簡單地通過一個函數作爲'whatToDo'而不是一個字符串'full of operations'? – Tyblitz

+0

這正是我在Tyblitz得到的要點。我不知道要做到這一點的最佳或正確的做法。 – user3223880

回答

0

return whatToDo;在您的「更快」示例中會導致立即跳過這兩個循環並退出該功能。它們不具有相同的效果,因此您的基準不適用。

怎麼做呢,反正:傳遞函數,調用函數。 JavaScript沒有太大的區別,這是它最有用的功能之一。

function eachBlock(whatToDo, totalX, totalY) { 
    for (var y = 0; y < totalY; y++) { 
     for (var x = 0; x < totalX; x++) { 
      /* Fake operation for theory */ 
      whatToDo(y, x); 
     } 
    } 
} 

function basicFunc() { 
    var totalX = 2000, totalY = 2000; 
    eachoBlock(function(y, x) { 
     var fakeVar = (y * x); 
     … 
    }, totalX, totalY); 
} 
+0

優秀點;除去。撇開基準,你對這個問題有什麼想法。 – user3223880

+0

@ user3223880:我仍然不確定你想要做什麼,因爲將一個字符串傳遞給函數並不會計算該字符串中的代碼。如果你想要某種回調,你會傳入一個函數,而不是一個字符串。 – Ryan

+0

這就是我不確定的地方。拋開我的錯誤(顯然很多),最簡單的方法是什麼?我希望'basicFunc'中的操作或多或少地插入到'eachBlock'的循環中,以便我可以調用並在每次需要循環序列時傳遞該操作。 – user3223880