解释一系列箭头运算符
解释一系列箭头运算符
这个问题已经有了答案:
我有一个包含以下代码的文件:
const logger = (options) => (req, res, next) => { if (typeof options === 'object' && options !== null && options.enable) { console.log( 'Status Code:', res.statusCode, 'URL:', req.originalUrl, ) } next() } module.exports = logger
它在另一个.js文件中被使用如下:
const express = require('express') const loggerMiddleware = require('./middleware-logger') const app = express() app.use(loggerMiddleware({ enable: true, })) app.listen( 1337, () => console.log('Web Server listening on 1337'), )
有人能解释一下第一行中箭头符号系列的含义吗?我了解一个普通的(req,res,next) => {}意味着什么:
\"有一个未命名函数,有3个参数,在花括号里定义了它们。
在这种情况下,由于箭头操作符的存在,我不理解的是函数定义如何同时看到(options)和(req,res,next)的所有参数。
底层到底发生了什么?这和承诺有什么关系吗?同样,一个方法定义如何同时看到所有的参数?
admin 更改状态以发布 2023年5月22日
你所展示的代码是一种简写方式:
const logger = function(options) { return function(req, res, next) { if (typeof options === 'object' && options !== null && options.enable) { console.log( 'Status Code:', res.statusCode, 'URL:', req.originalUrl, ) } next() } }
如果你调用了loggerMiddleware({enable: true,})
,它会返回一个新的函数function(req, res, next) { ... }
,该函数在options
参数上创建了一个闭包。
这使得返回的函数(在这种情况下是中间件)可以在每个请求中访问传递的选项对象,而无需污染全局范围。
由此,还可以使用不同选项创建两个中间件:
app.get('/with-logging', loggerMiddleware({ enable: true, }), function(res, res) {}) app.get('/without-logging', loggerMiddleware({ enable: false, }), function(res, res) {})
个人认为(options) => (req, res, next) => {
这些结构并不真正易读,并让我想起那些花哨的嵌套三元条件运算符(?:
)组合。