Javascript 从外部函数返回内部函数是否可能?

Javascript 从外部函数返回内部函数是否可能?,javascript,coffeescript,Javascript,Coffeescript,我想从内部函数跳出外部函数 something = true outer: (next)-> @inner (err)-> if err? next err #jump out of outer function here console.log 'still in outer' inner: (next)-> next new Error 'oops' if @somethi

我想从内部函数跳出外部函数

something = true

outer: (next)-> 
    @inner (err)-> 
        if err?
            next err 
            #jump out of outer function here

    console.log 'still in outer'

inner: (next)-> 
    next new Error 'oops' if @something is true
代码是用coffeescript编写的,但是javascript的答案是受欢迎的

更新

感谢您的快速回复-那么使用
@internal
函数的返回值怎么样?这类事情有一个普遍接受的模式吗

something = true

outer: (next)-> 
    return unless @inner (err)-> next err if err
    console.log 'still in outer'

inner: (next)-> 
    if @something is true
        next new Error 'oops'
        return false
    return true
如果要立即退出外部的原因是发生了异常情况(错误),则可以抛出异常。如果
outer
没有捕获到它,那么
outer
将被终止(就像
outer
的调用者一样,依此类推,直到某个异常被捕获或者JS引擎本身捕获为止)

不过,对于正常的程序流,在JavaScript和各种语言中,我们不会对正常的程序流使用异常(尤其是因为它们很昂贵)。对于这些情况,不,被调用函数无法终止其调用方;它必须返回调用者用来知道退出的值,或者在两者的作用域内的变量上设置一个值

下面的示例更新为使用
内部
的返回值,这是执行此操作最常见的方法:

something = true

outer: (next)-> 
    stop = @inner (err)-> 
        if err?
            next err 
            #jump out of outer function here

    if stop
      return
    console.log 'still in outer'

inner: (next)-> 
    next new Error 'oops' if @something is true
    if someCondition
      return true
以下是更新后的示例,以使用它们都关闭的变量:

something = true

stop = false

outer: (next)-> 
    @inner (err)-> 
        if err?
            next err 
            #jump out of outer function here

    if stop
      return
    console.log 'still in outer'

inner: (next)-> 
    next new Error 'oops' if @something is true
    if someCondition
      stop = true

(请原谅我的CoffeeScript,我没有使用它。)

您需要一个bool变量&当从内部函数集返回该变量时&在外部函数中检查它的值,如果是;设置为true,然后从外部返回。你当然可以
抛出
。@T.J.Crowder:这取决于语言范式(我有点像python),当然也取决于OP跳出的原因是否是例外:-)@biofractal:Yes,返回值是执行此操作的常用方法。@T.J.Crowder:在您的示例中设置的
stop
标志的值在哪里?@biofractal:呃,嗯……在我与咖啡脚本的斗争中,我似乎忘记了这一点。我的第一个例子,完全是我编的(这是在你更新代码之前),已经有了它!:-)让我想想,一秒钟…@biofractal:我加了。太好了,谢谢。瞧,我终于让你写咖啡剧本了。他们说这永远不会发生:-@mathheadinclouds-投掷错误过去比现在昂贵得多(但在某些引擎上仍然昂贵)。抛出非错误不是,特别是(不需要收集堆栈信息),这就是为什么我在回答您的问题时从未声称它是。我想我们已经说了所有需要对彼此说的话,让我们把它放在那里吧,谢谢。您想使用
throw
执行主线吗?击倒你自己,这是你的密码。