学生试图了解回调函数

时间:2016-05-27 19:00:16

标签: javascript callback

您好,我正在尝试学习如何实现回调函数。我的老师多次帮助过我,但我仍然无法通过以下公式传递数据。我试图让某些数组元素被推入新函数,只要它们在函数内通过测试。请看一下,谢谢你的意见。关于为什么我得到一个空数组和资源以进一步理解的解释将不胜感激。

// 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);

5 个答案:

答案 0 :(得分:3)

您正在arr循环之外构建each()

我认为你的代码会是这样的:

// 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) {

在您的情况下,您不需要使用最后两个参数。

答案 1 :(得分:0)

两点:

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

但是,您的implement()功能可能存在错误。arr已经之后,您才会推进each()被称为:

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;
}

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

&#13;
&#13;
// 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
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您定义的回调是

function(item){
  test(item);
}

这只会在每个test上调用item即可。{p>如果您希望进一步将item添加到arr,如果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;
}

资源方面,有在线广泛提供的回调教程以及最佳实践。您可以通过谷歌搜索轻松找到最适合您的。

答案 3 :(得分:0)

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

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

好的,首先让我们来看看这段代码。您正在调用每个函数,它将使用此处定义的回调匿名函数。

但是,如果您要查看每个函数本身,则没有返回(这意味着它默认返回undefined)。每个都没有修改。因此,这组代码对代码的执行没有影响,并且如果使用了某些高级编译技术,则实际上可以通过chrome中的V8引擎删除它。

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

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

}
return arr;

此时,test仍然是isEven函数,所以你基本上都是这个

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

当在条件语句中使用时,JavaScript中的数组行为很有趣,在这种情况下,数组实际上已经调用了toString(在这里更深入:https://stackoverflow.com/a/10556035/1026459,但基本上当你有对象=== number时它将尝试在导致字符串的对象上使用toPrimitive,这使得它成为

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

这是假的。因此,arr保持不变,并以原始状态[]返回。

答案 4 :(得分: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。