我已经完成了相当多的阅读并看到了很多关于这个主题的不同问题,但我想知道我是否可以获得帮助,因为为什么突破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;
}
我能够使用其他函数重新创建我想要的效果,但是想了解为什么这不起作用,因为我正在学习如何在其他函数中实现函数的使用。
谢谢。
答案 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.isArray
为undefined
。您应该将其替换为Array.isArray(collection)
。
对于非数组类型,您不会检查callback(collection[key])
的返回值。