解释一系列箭头运算符

8 浏览
0 Comments

解释一系列箭头运算符

这个问题已经有了答案

JavaScript中多个箭头函数是什么意思?

我有一个包含以下代码的文件:

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日
0
0 Comments

你所展示的代码是一种简写方式:

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) => {这些结构并不真正易读,并让我想起那些花哨的嵌套三元条件运算符(?:)组合。

0