当前位置: 首页 > 面试题库 >

我应该在JavaScript的回调函数中使用“ return”吗?

申屠晟
2023-03-14
问题内容

我在JS应用程序中使用异步函数,这些函数包装有接收回调输入的我自己的函数。当我调用回调函数时,是否需要使用“ return”关键字?有关系吗?有什么不同?

例如:

var getData = function(callback){
    // do some aysnc db stuff...
    return callback(results);
    // or just
    callback(results);
}

PS:我正在使用javascript编写混合移动应用。


问题答案:

如果只有一条路径通过函数,则可以将两种形式互换使用。当然,该函数的返回值将在没有返回的情况下是不确定的,但是您的调用代码可能仍未使用它。

没错

return callback()

实际上相当于

callback(result); return;

后者的确在调用堆栈上导致了额外的帧,因此使用了更多的资源。我想如果您有许多嵌套的回调,或者正在执行递归,那么您将更快地耗尽堆栈空间。

这可能是一个坏主意,我不认为我在说回调之前的返回更加惯用了。

如果函数中有多个路径,则必须小心。例如,这将按预期工作:

(cb)=> {
    if (something) cb('a')
    else cb('b')
}

但是,在这种情况下,两个回调都将被调用。

(cb)=> {
    if (something) cb('a');

    cb('b')
}

当您阅读以上内容时,很明显两者都会被调用。然而,编写这样的代码是一个经典的节点新手错误(尤其是在处理错误时)。如果要执行或要执行,则需要:

(cb)=> {
    if (something) return cb('a');

    cb('b')
}


 类似资料:
  • 问题内容: 这是我从这里看到的代码。我对关键字感到困惑。 对于,我需要? 对于,我需要? 问题答案: 无需在回调中使用return语句。Promise构造函数不期望回调返回任何类型的返回值。 因此,在该回调中使用语句的原因仅是为了控制该函数中的执行流程。 如果您希望回调内部的执行完成而又不执行该回调中的任何其他代码,则可以在此时发出a 。 例如,您可以这样编写代码,而无需声明: 在这种情况下,您使

  • 问题内容: 新的es6箭头功能说在某些情况下是隐式的: 该表达式也是该函数的隐式返回值。 在什么情况下需要使用es6箭头功能? 问题答案: 隐式返回,但仅当没有块时才返回。 * 当单线扩展到多行并且程序员忘记添加时,这将导致错误。 * 隐式返回在语法上是模棱两可的。返回对象…对吗?错误。它返回。这些括号是一个明确的块。是一个标签。 我会在此添加一个块的定义: 块语句(或其他语言的复合语句)用于将零

  • 请考虑以下代码: GCC和Clang编译代码时没有错误,也就是说,使用花括号时调用了复制构造函数。但是msvc拒绝了https://godbolt.org/z/49onKj的错误: 当我指定显式调用复制构造函数(因为不是右值),然后mvsc接受代码。 谁是对的?应该调用什么类型的构造函数来 语句?

  • 新的ES6箭头函数表示在某些情况下是隐式的: 表达式也是该函数的隐式返回值。 在什么情况下,我需要将与ES6箭头函数一起使用?

  • 在C#中使用await/async时,有很多关于何时使用< code > configurewait(false)的指导原则。 一般建议在库代码中使用,因为它很少依赖于同步上下文。 然而,假设我们正在编写一些非常通用的实用程序代码,它接受一个函数作为输入。一个简单的例子是下面的(不完整的)函数组合子,它使简单的基于任务的操作变得更容易: 地图: 平面图: 问题是,在这种情况下,我们应该使用吗?我不

  • 我的问题是:为什么调用不更快或更好,从而更可取?