为什么JS forEach函数中的'break'不被允许?

时间:2014-12-21 22:52:09

标签: javascript foreach

我已经完成了相当多的阅读并看到了很多关于这个主题的不同问题,但我想知道我是否可以获得帮助,因为为什么突破For Each循环并不起作用。另外,我很新,所以如果这个问题以不同的方式回答我无法理解,我会提前道歉。

到目前为止,我已经编写了一个forEach函数来模拟原生.forEach方法:

function forEach(collection, callback){
  if(collection.isArray){
    for(var i =0;i<collection.length&&callback(collection[i])!==false;i++){
      callback(collection[i]);
    }
  }else{
    for(var key in collection){
      callback(collection[key]);
    }
  }
}

当我尝试利用它来编写另一个功能时,找到&#39;搜索匹配条件的数组的第一个实例,使用&#39; return&#39;或者&#39;打破&#39;似乎不起作用。 find([1,2,3,4,5] .function(x){return x&gt; 3;});返回5而不是4。

function find (collection, criteria){
  var result;
  forEach(collection, function(x){
    if(criteria(x)){
      result =x;
      return false;
    }
  });
  return result;
}

我能够使用其他函数重新创建我想要的效果,但是想了解为什么这不起作用,因为我正在学习如何在其他函数中实现函数的使用。

谢谢。

2 个答案:

答案 0 :(得分:2)

在此代码段中考虑bar的行为:

function foo(x) {
    return x;
}

function bar() {
    foo(1);
    foo(2);
    return 3;
}

console.log(bar());

它会调用foo,但它会将控制权返还给bar本身,而不是bar的调用者,因此会记录3。

如果我们将foo的定义放在bar中,情况就不会改变:

function bar() {
    function foo(x) {
        return x;
    }

    foo(1);
    foo(2);
    return 3;
}

console.log(bar());

如果我们接受它作为参数,它也不会改变:

function foo(x) {
    return x;
}

function bar(baz) {
    baz(1);
    baz(2);
    return 3;
}

console.log(bar(foo));

当我们使用函数表达式时,行为不会改变:

function bar(baz) {
    baz(1);
    baz(2);
    return 3;
}

console.log(bar(function(x) {
    return x;
}));

因此return不能按照您传递给forEach的函数的方式工作的原因是return保留了从其所在函数返回的通常含义词法包含该功能的功能。同样,break是非法的,因为它不在循环中;它位于一个函数中(以后只会在循环中调用)。

答案 1 :(得分:0)

对于数组,collection.isArrayundefined。您应该将其替换为Array.isArray(collection)

对于非数组类型,您不会检查callback(collection[key])的返回值。