打破jQuery each函数的父级函数

6
我有一个$.each jQuery函数位于父javascript函数中,我如何在特定索引(i)处终止父函数?

1
“打破父函数”是什么意思?你是指“返回父函数”吗? - lonesomeday
5个回答

10

要退出循环,只需返回 false

$('something').each(function() {
    if (need_to_break) {
        return false; // returning false stops the loop
    }
});

要从多个each循环中跳出/返回,请抛出异常:
var $break = {};
$('something').each(function() {
    try {
        $('something').each(function() {
            $('something').each(function() {
                $('something').each(function() {
                    throw $break;
                });
            });
        });
    } catch(E) {
        if (E != $break) throw E;
    }
});

并在您想要返回的循环中捕获它。

这就是Prototype.js如何实现break,例如在它们的Enumerable.each()中。

更传统的解决方案:

var do_break = false;
$('something').each(function() {
    $('something').each(function() {
        $('something').each(function() {
            $('something').each(function() {
                do_break = true;
                return false;
            });
            if (do_break) {
                return false;
            }
        });
        if (do_break) {
            return false;
        }
    });
    if (do_break) {
        return false;
    }
});

1
OP没有提到“多个”each循环。 - jAndy
我个人认为,在编写服务器端代码时,使用try catch并不是正确的方法。它应该只用于处理意外错误,其他情况应该有相应的处理方式。请查看我的答案,了解另一种解决方案。 - Victor
2
这只捕获break异常,所以在这方面是完全安全的。是的,这很不寻常。但这实际上是一种非常有效的方法;如果你尝试用其他方式来做这件事(使用多个嵌套循环),你会发现1. 你正在做throw/catch本来该做的事情,2. 这更难阅读和理解。 - Arnaud Le Blanc

8
听起来你有类似这样的东西:
function outer(someParam) {
    $.each(someParam, function(i) {
        // do something with each value in someParam
    });
}

当内部循环达到某个值时,你希望从outer返回。但你无法一次性完成这个任务。关键在于,如果从$.each回调函数中使用return false,则会结束“循环”。然后,如果需要,可以设置一个变量进行有条件的返回:

function outer(someParam) {
    var returnNow = false;
    $.each(someParam, function(i) {
        if (i === 5) {
            returnNow = true;
            return false;
        }

        // do something with each value in someParam
    });

    if (returnNow) {
        return;
        // return immediately
    }

    // do some other action if you want to
}

返回和返回false之间有区别吗? - bcm
$.each处理程序中,您必须返回false以终止循环。如果您可以给出一个更精确的示例,那么我们就可以更容易地给出更精确的答案。 - lonesomeday

0

你可以这样做:

function foo() {

var success = true;

$('element').each(function() {

    if (condition) {
        success = false;
        return success;
    }

});

if (!success)
   return false;

//should not get here
}

0
我能想到的唯一解决方案是在父函数中设置一个变量(开关),在每个函数中,如果i==x,则先在更改开关后退出each函数...然后检查开关值以确定是否退出父函数。

0

标记式跳出

outerloop:
for (;;) 
{
    for (;;) 
    {
        break; /* breaks inner loop */
    } 
    for (;;) 
    {
        break outerloop; /* breaks outer loop */
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接