首页 > 解决方案 > Javascript 中函数参数的隐式传递是如何工作的?

问题描述

我最初来自 Java 编程语言作为背景。Java 是强类型的并且非常明确(我的意思是,你必须写出来,你不能只是省略它们)。一件事,我永远不会想到的是传递给javascript的隐式参数是如何工作的......

举个例子:

const observer = {
    next: console.log,
    error: console.error,
    test: console.table,
}

observer.next('HI World!')

接下来,我指定 console.log 是一个函数,但我从来没有说过要接受一个值,但在 Javascript 中,我显然可以将任何东西作为后缀扔给函数,并将其作为函数的参数。这也是流水线或柯里化的基本工作原理,它将剩余的返回值作为参数......为什么会这样?

其次,例如在快递中,我有一个像这样的函数签名:

app.get('/', function (req, res) {
  res.send('GET request to the homepage');
});

我实际上从我的函数回调中得到了 req 和 res 是吗?这些不是我传递给回调函数的参数吗?

编辑:有人可以再次向我解释REQRES参数的来源吗?这个结构是如何工作的?因为我自己定义了回调函数,但不是将 req 和 res 作为参数传递给我的回调,它们似乎是从某个地方传递回我的回调函数内部的?!?!

标签: javascriptcallbackparameter-passing

解决方案


JavaScript 中的函数是一个对象,就像任何其他对象一样。这意味着一个函数可以被传递,可以分配给变量,并且基本上可以在任何可以使用值的地方使用。这被称为一等函数

例如,给定一个像这样的简单函数:

function log(msg) {
  console.log(msg);
}

这两个函数在概念上是等价的:

const log1 = log;

// same as

function log1(msg) {
  log(msg);
}

如您所见,我们可以直接将函数分配给log变量,例如log1,,然后我们可以像使用log1一样使用log

log1('foobar');

一等函数的另一个用途是能够将它们作为参数传递给其他函数。像您的 Express 示例中那样接受回调的函数称为高阶函数。回调的参数由该回调的调用者提供。在您的情况下,Express 提供了reqandres参数。

使用回调是控制反转的一种形式。您正在将程序那部分的控制权传递给调用者。


推荐阅读