Javascript 从嵌套函数返回

Javascript 从嵌套函数返回,javascript,jquery,Javascript,Jquery,在这种情况下,打破嵌套函数的惯例是什么?当对循环使用时,在循环内返回将终止包围它们的整个函数。但是,由于$.each()是一个单独的函数调用,因此从它返回的仅结束自身,而不是外部函数。我可以简单地返回两次,一次在内部,一次在外部,但我不确定如何处理$。ajax(),因为只有在得到成功响应时才需要终止函数。对于$。each(),您可以使用返回false停止迭代,如中所述 这不会从调用函数返回,但是您可以设置一个标志并在外部函数中测试它 如果您想要一种从循环内部从外部函数返回的简单方法,最好使用一个

在这种情况下,打破嵌套函数的惯例是什么?当对循环使用
时,在循环内返回将终止包围它们的整个函数。但是,由于
$.each()
是一个单独的函数调用,因此从它返回的仅结束自身,而不是外部函数。我可以简单地
返回两次
,一次在内部,一次在外部,但我不确定如何处理
$。ajax()
,因为只有在得到成功响应时才需要终止函数。

对于
$。each()
,您可以使用
返回false停止迭代,如中所述

这不会从调用函数返回,但是您可以设置一个标志并在外部函数中测试它

如果您想要一种从循环内部从外部函数返回的简单方法,最好使用一个简单的
for
循环:

function outer() {
    $(['hi', 'there']).each(function(idx, e) {
        console.log(e);
        return;
    });
    alert("I don't want to be called");
}

function outer() {    
    $.get('http://test.com', function (data) {
        console.log(data)
        return; // I want to terminate the entire outer() function here.
    });
    alert("I don't want to be called");
}
现在,您将注意到日志消息的顺序:

function outer() {
    console.log( 'in outer before $.get is called' );
    $.get('http://test.com', function (data) {
        console.log( 'inside $.get callback' );
    });
    console.log( 'in outer after $.get returns' );
}
看看回调是怎么回事?它在
外部
函数完成后调用。因此,此回调无法阻止其余的
outer
执行


因此,你需要更多地思考你需要做什么,并找出一种不同的方法来完成它。

这里是所有工作原理的总结

.each()

简言之,无法在一条语句中中断包含
.each()
的函数

$.get()

由于在ajax调用完成之前,
$.get()
中的返回不会执行,因此它没有多大用处。即使在进行同步ajax调用时,success回调中的return语句仍然不会做任何实质性的事情将函数的返回视为分配给调用语句的值。

什么使您有必要中断函数?

如果您使用$.ajax()而不是简写的$.get(),则可以指定它是同步执行的

return [true|false]; // makes no sense at all.

通常,当您想根据函数的返回值做出决定时,您让它返回一个值,然后使用条件语句来确定接下来会发生什么。

我不完全确定,但请尝试
return false由于Ajax的异步特性,您不能这样做。简短回答:您不能。对于第一个示例,可以有一个排序的解决方法,但是
$.get
是异步的,在调用内部函数之前,
outer
将返回。这不是嵌套函数。它是回调函数。谷歌搜索。@zsong:它仍然是一个嵌套函数。它们不是相互排斥的术语。
async:false
有一些非常不希望的后果。在某些浏览器中,如果服务器速度慢或响应失败,它不仅会锁定当前浏览器选项卡/窗口,还会锁定所有浏览器窗口。建议将其作为最后的手段-编写正确的异步代码要好得多。嗨,Michael。谢谢我检查了文档,似乎无法中断外部函数,因为
return false
只是终止
$。each()
函数。是的,我误解了您的要求,抱歉!您应该只为
循环使用一个简单的
,而不是
$。each()
使其易于实现;我更新了答案。。。
in outer before $.get is called
in outer after $.get returns
inside $.get callback
return true;  // skips to the next iteration of .each()
return false; // exits the .each() loop
return [true|false]; // makes no sense at all.
$.ajax({
  url: 'http://test.com',
  success: function (data) {
  },
  async: false
});