2017-03-17 53 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从代码中的任意位置的功能。