为什么 JS 中不允许每个函数的“break”
Why is 'break' in JS forEach function not allowed?
我已经阅读了很多内容,并看到了有关此主题的许多不同问题,但我想知道我是否可以获得有关为什么打破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.isArray
是undefined
。您应该将其替换为 Array.isArray(collection)
。
对于非数组类型,您不会检查 callback(collection[key])
的返回值。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- jquery点击函数select&取消选择
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- Node.js v6.2.0类扩展不是函数错误
- 为什么 JS 中不允许每个函数的“break”
- 在break Javascript中拆分字符串(来自c#函数)
- 函数中的break/return函数