2017-03-17 9 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呼び出すようにしてみてください。

関連する問題