2017-03-17 29 views
1

我有一個函數使用Array.prototype.forEach並將回調傳遞給它。我想將該回調提取到一個單獨的函數中,以便測試它。問題是回調使用了來自外部函數的參數,回調的簽名當然是由Array.prototype.forEach決定的,我無法更改它。有什麼辦法可以解決這個問題嗎?代碼示例如下:如何提取關閉一些變量的匿名回調?

var enableMarks = function (arrEvents, arrGeneratedEvents) { 
    var marksLength = arrEvents[0].marks().length; 
    var generatedMark; 
    var i; 
    for (i = 0; i < arrGeneratedEvents.length; i++) { 
    programEvents.forEach(function (programEvent) { 
     if (programEvent.pairOrderToShow === arrGeneratedEvents[i]) { 
     generatedMark = generateNumber(0, marksLength - 1); 
     } 
     //some other code here, not important for question 
    }); 
    } 

};

所以,我的回調從外部函數使用arrGeneratedEvents,我不知道是否有可能以某種方式傳遞這個提取回調。

回答

1

你可以嘗試這樣的方式

var enableMarks = function(arrEvents, arrGeneratedEvents) { 
    var marksLength = arrEvents[0].marks().length; 
    var generatedMark; 
    var i; 
    // this is the callback function of forEach 
    // beise element, it can also acceopt the index and the to traverse array 
    function testFun(item) { 
     if (programEvent.pairOrderToShow === arrGeneratedEvents[i]) { 
     generatedMark = generateNumber(0, marksLength - 1); 
     } 
     //some other code here, not important for question 
    } 

    for (i = 0; i < arrGeneratedEvents.length; i++) { 
    //calling the callback function here, & passing an argument 
    programEvents.forEach(testFun); 
    } 
}; 
+0

我不確定這會起作用。 'testFun(elem to pass)'不計算爲函數類型(並且'forEach'需要函數類型)。 –

+0

@OliverCharlesworth我指的是這裏給出的第一個例子 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach – brk

+0

我在那裏沒有看到任何例子這不會將函數類型傳遞給'forEach';) –

1
let cbfunc = function (programEvent, index, arrGeneratedEvents,i) { 
    if (programEvent.pairOrderToShow === arrGeneratedEvents[i]) { 
    generatedMark = generateNumber(0, marksLength - 1); 
    } 
    //some other code here, not important for question 
}; 

programEvents.forEach(cbfunc); 

現在給你打電話cbfunc從代碼中的任意位置的功能。