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

标签 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]);
    }
  }
}

当我尝试利用它编写另一个函数“find”来搜索符合条件的数组的第一个实例时,使用“return”或“break”似乎不起作用。 find([1,2,3,4,5].function(x){return x>3;});返回 5 而不是 4。

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

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

谢谢。

最佳答案

考虑此代码段中 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 也是非法的,因为它不在循环中;它在一个函数中(仅在稍后的循环中被调用)。

关于javascript - 为什么不允许JS forEach函数中的 'break'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594614/

相关文章:

javascript - THREE.js OBJ 加载器对象

javascript - 单击时更改 DIV 高度

javascript - 递归转换json对象

php - foreach循环php中的总和值

带有嵌套数组的 PHP foreach?

java - 循环中未使用的变量

javascript - 为什么我可以比较两个带有 "=="的字符串,但不能比较两个字符数组?

javascript - 如何确保使用 setTimeout 时 Javascript 的 "this"会引用该对象?

c# - foreach Dictionary<>.Values 或 foreach Dictionary<>

c# - SetItemCheckState 中断 foreach!帮助?