javascript - 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 是吗?这些不是我传递给回调函数的参数吗?
编辑:有人可以再次向我解释REQ
和RES
参数的来源吗?这个结构是如何工作的?因为我自己定义了回调函数,但不是将 req 和 res 作为参数传递给我的回调,它们似乎是从某个地方传递回我的回调函数内部的?!?!
解决方案
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 提供了req
andres
参数。
使用回调是控制反转的一种形式。您正在将程序那部分的控制权传递给调用者。
推荐阅读
- flask - OSError: [Errno 98] Address already in use 如何在 python flask 中解决
- c - MPi 多播 BIGNUM
- c# - 如何对文本框 textchanged 上的过滤行求和?
- ios - Xcode 10.2 beta 10P82s 扩展没有成员
- android - 将 JSON 转换为 kotlin 数据类时出错
- java - SceneBuilder,如何将节点拖放到自定义控件中。[JAVAFX]
- java - 搜索数组返回计数找到
- node.js - 无法在 Mac OSX 上安装 Handlebars
- c# - C#同时执行资源监控逻辑和其他任务
- android - 如何在我的 esc/pos 热敏打印机中对齐条形码