2014-01-22 5 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» вместо строки «полный операций»? – Tyblitz

+0

Это точно суть, которую я получаю в Тиблице. Я не знаю о лучшей или правильной практике, чтобы сделать именно это. – 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

Смежные вопросы