【问题标题】:Is it possible to return from an outer function from within an inner function?是否可以从内部函数中从外部函数返回?
【发布时间】:2014-08-01 12:57:20
【问题描述】:

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

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

【问题讨论】:

  • 你需要有一个 bool 变量 & 从内部函数返回时设置该变量 & 在外部函数中检查它的值,如果它设置为 true 然后也从外部返回。
  • 当然可以throw...
  • @T.J.Crowder:这取决于语言范式(我有点pythonic),当然,OP 跳出的原因是否真的是特殊的:-)
  • @biofractal:是的,返回值是执行此操作的常用方法。
  • @T.J.Crowder: More or less, yes

标签: javascript coffeescript


【解决方案1】:

如果您想立即退出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,我不使用它。)

【讨论】:

  • 您的示例中设置的stop 标志的值在哪里?
  • @biofractal:呃,嗯……我似乎在与 CoffeeScript 的斗争中忘记了这一点。我完全编写的 first 示例(这是在您更新代码之前)拥有它! :-) 让我们看看,一秒钟......
  • @biofractal:我已经添加了。
  • 太好了,谢谢。看,我终于让你写出了 CoffeeScript。他们说这永远不会发生:-)
  • @mathheadinclouds - 抛出 errors 过去比现在要昂贵得多(但在某些引擎上仍然很昂贵)。抛出非错误不是,特别是(不需要收集堆栈信息),这就是为什么我在回答你的问题时从未声称它是。我想我们已经说了所有需要对彼此说的话,让我们把它留在那里,谢谢。您想使用throw 进行主线执行吗?把自己弄晕,这是你的代码。
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多