2016-05-27 53 views
3

嗨我想学习如何实现回调函数。我的老师多次帮助过我,但我仍然无法通过下面的公式传递数据。我试图让某些元素的数组被推入一个新的函数,只要他们在函数中通过一个测试。请看看并感谢您的意见。为什么我得到一个空阵列和资源来进一步理解的解释将不胜感激。学生试图了解回调函数

// EACH DEFINITION 
function each (collection, callback) { 
    for(var i = 0; i < collection.length; i ++){ 
    callback(collection[i]); 
    } 
} 


// VARIABLE DECLARATION 
var myArray = [1,2,3,4,5,6]; 
var isEven = function (num) { 
    return num % 2 === 0; 
}; 

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item){ 
    test(item); 
    }); 
    if(test(array)){ 
     arr.push(array); 

    } 

    return arr; 
} 

// IMPLEMENT INVOCATION 

implement(myArray, isEven); 
+0

你为什么要在循环之外推动结果? – ShuberFu

回答

0
// EACH DEFINITION 
function each (collection, callback, results) { 
    for(var i = 0; i < collection.length; i ++){ 
    callback(collection[i]); 
    } 
    console.log(results); 
} 


// VARIABLE DECLARATION 
var myArray = [1,2,3,4,5,6]; 
var isEven = function (num, array) { 
    return num % 2 === 0; 
}; 

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    function filter (item) { 
    if (test(item)) { 
     arr.push(item); 
    } 
    } 
    each(array, filter, arr); 
    // If you return arr here, it will still be empty. You must pass it to functions it is being operated on. 
} 

// IMPLEMENT INVOCATION 

implement(myArray, isEven); 

你不仅试图将arr推到你的循环之外,而是试图在获得任何值之前返回arr。

3

您正在each()环外建设arr

我想你的代码会是这样的:

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item){ 
    if(test(item)) { 
     arr.push(item); 
    } 
    }); 

    return arr; 
} 

尽管在这种情况下,没有理由为您implement()过滤功能可言,因为JavaScript数组原型已经具备了filter方法。你可以简化你的电话本:

var filteredArray = myArray.filter(isEven); 

虽然你可能也然后想改变你的ISEVEN定义更正确为:

var isEven = function (num, index, array) { 

你的情况,你不需要有工作最后两个参数。

+2

是正确的迂腐,但我认为你的意思是JavaScript不是Java。 – ste2425

+0

@ ste2425的确我在做:) –

0

两点:

首先,你的回调函数的实现是正确的。就回调的概念而言,您正在调用并正确传递函数。

但是,您的implement()函数可能有一个错误。你之后each()不推到arr直到已经被称为:

function implement(array, test) { // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item) { 
     result = test(item); 
    }); 

    // This block should be in the loop itself 
    // It should also refer to item, not array 
    if (test(array)) { 
     arr.push(array); 
    } 

    return arr; 
} 

尝试根据您所提供的代码此修复程序:

// EACH DEFINITION 
 
function each(collection, callback) { 
 
    for (var i = 0; i < collection.length; i++) { 
 
    callback(collection[i]); 
 
    } 
 
} 
 

 

 
// VARIABLE DECLARATION 
 
var myArray = [1, 2, 3, 4, 5, 6]; 
 
var isEven = function(num) { 
 
    return num % 2 === 0; 
 
}; 
 

 
// IMPLEMENT DEFINITION 
 
function implement(array, test) { // array = myArray, test = isEven 
 
    var arr = []; 
 
    each(array, function(item) { 
 
    if (test(item)) { 
 
     arr.push(item) 
 
    } 
 
    }); 
 
    
 
    if (test(array)) { 
 
    arr.push(array); 
 

 
    } 
 

 
    return arr; 
 
} 
 

 
// IMPLEMENT INVOCATION 
 

 
var result = implement(myArray, isEven); 
 
console.log(result); // For snippet results

0

你的回调,如你所定义的,是

function(item){ 
    test(item); 
} 

这只会在每个item上调用test就是这样。既然你要采取进一步添加itemarr如果test返回true,你应该把回调内部的检查代码,以及,使得它

function(item){ 
    if (test(item)) { 
    arr.push(item); 
    } 
} 

,使这个函数会被每个项目。

而且,这部分

if(test(array)){ 
    arr.push(array); 
} 

不正确,因为你传递一个整个数组到ISEVEN时ISEVEN期待的数字。test(array)将始终返回false;这就是为什么你的arr是空的。

修改你的代码,你想工作,这将是

// IMPLEMENT DEFINITION 
function implement(array, test){ // array = myArray, test = isEven 
    var arr = []; 
    each(array, function(item){ 
    if (test(item)) { 
     arr.push(item); 
    } 
    }); 

    return arr; 
} 

资源明智的,有回调教程广泛使用的在线,以及最佳实践。您可以通过Google搜索轻松找到最适合您的搜索结果。

0

它看起来像我这里的整个问题是在你表示的实现部分。所有其他代码看起来都足够了。

each(array, function(item){ 
    test(item); 
}); 

好吧,首先让我们来看看这段代码。您正在对每个函数进行调用,它将使用此处定义的回调匿名函数,如图所示。但是,如果您要查看每个函数本身,则不会返回(这意味着它默认返回undefined)。也没有修改在每个。因此,这组代码对代码的执行没有影响,并且某些高级编译技术可能实际上被V8引擎在chrome中删除(如果使用的话)。

这意味着正在执行代码的唯一方面是

var arr = []; 
if(test(array)){ 
    arr.push(array); 

} 
return arr; 

在这一点上,测试仍然是isEven功能,所以你基本上是问在JavaScript这个

if(array % 2 === 0) arr.push(array); 

阵列在条件语句中使用时表现得有趣,在这种情况下,数组实际上有toString调用它(更深入的这里:https://stackoverflow.com/a/10556035/1026459,但基本上当你有对象===号码时,它会尝试使用toPr对对象产生影响,导致字符串),这使得它是

if("1,2,3" % 2 === 0) 

这是错误的。因此arr不变,并返回其原始状态[]