为什么 JS 中不允许每个函数的“break”

Why is 'break' in JS forEach function not allowed?

本文关键字:break 函数 JS 不允许 为什么      更新时间:2023-09-26

我已经阅读了很多内容,并看到了有关此主题的许多不同问题,但我想知道我是否可以获得有关为什么打破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"来搜索与条件匹配的数组的第一个实例时,使用"返回"或"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是非法的,因为它不在循环中;它在一个函数中(稍后才碰巧在循环中调用)。

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

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