区分JavaScript中的普通函数还是闭包?

区分JavaScript中的普通函数还是闭包?,javascript,closures,Javascript,Closures,当我学习JavaScript时,我对如何调用可能是clousre的函数感到困惑。我以前用过Java 当我为koa2编写中间件时,我会编写: async function gzip(ctx, next) { } 如果我们需要一个选项: function gzipWithOption(option){ return async function gzip(ctx, next) { } } 或: 我的困惑是,koa2或其他编译器系统如何知道它是否应该调用: theDarkFunc(param

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

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

async function gzip(ctx, next) { }
如果我们需要一个选项:

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

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

theDarkFunc(param)
或:


程序员是怎么知道的?仅通过阅读doc?

我对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()
,如果
f()
返回的值是函数,则该函数将返回
'function'
(请注意
typeof
返回字符串,因此在单词'function'周围加上引号)


通常情况下,文档会向您指示某物的返回值。否则,如果它是由您或其他人在自己的代码库中编写的,则必须查看函数是否返回某种类型的值或function@francium是的,我可以阅读doc,但koa2或其他编译系统是如何知道的?@hyyou2010,如果这仍然不能回答您的问题,请告诉我
theDarkFunc(option)(param)
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
}
val = f()

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