首页 > 解决方案 > 区分 JavaScript 中的普通函数或闭包?

问题描述

当我学习 JavaScript 时,我对如何调用一个可能是 clousre 的函数感到困惑。我以前用过Java。

当我为 koa2 编写中间件时,我会写:

async function gzip(ctx, next) { }

如果我们需要一个选项:

function gzipWithOption(option){
   return async function gzip(ctx, next) { }
}

或者:

module.exports = options => {
  return async function gzip(ctx, next) { }
}

我的困惑是,koa2 或其他编译器系统如何知道它是否应该调用:

theDarkFunc(param)

或者:

theDarkFunc(option)(param)

程序员怎么知道的?仅通过阅读文档?

标签: javascriptclosures

解决方案


我没有专门使用 koa2 或其他节点服务器框架的经验,但是在 JavaScript 运行时确定函数返回的值是另一个函数还是常规值是非常可行的。

例如,假设您有一个调用的函数f返回一些东西,但您事先不知道。在这种情况下,我们可以检查返回的值并相应地执行操作。

f = () => { ... }

val = f()

// you don't know the type of val, so let's find out

if (val instanceof Function) {
  // val is a function, so you handle it in one way
} else {
  // val is not a function, so you handle it in another way
}

您也可以使用typeof f(),'function'如果返回的值f()是一个函数,它将返回(请注意,它typeof返回一个字符串,因此单词 'function' 周围有引号)

val = f()

typeof val === 'function'
typeof val !== 'function'

推荐阅读