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

时间:2014-08-01 12:57:21

标签: 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 @something is true

代码在coffeescript中,但欢迎使用javascript答案。

更新

感谢您快速回复 - 那么如何使用@inner函数的返回值?对于这种事情,是否存在普遍接受的模式?

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

1 个答案:

答案 0 :(得分:0)

如果要立即退出outer原因是发生异常情况(错误),则可以抛出异常。如果outer没有捕获它,outer将被终止(与outer的调用者一样,依此类推,直到捕获异常或JS引擎本身为止)。

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

以下是您的示例已更新为使用inner的返回值,这是执行此操作的最常用方法:

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,我不使用它。)