Javascript 解释一系列箭头运算符
我有一个包含以下代码的文件:Javascript 解释一系列箭头运算符,javascript,express,ecmascript-6,Javascript,Express,Ecmascript 6,我有一个包含以下代码的文件: const logger = (options) => (req, res, next) => { if (typeof options === 'object' && options !== null && options.enable) { console.log( 'Status Code:', res.statusCode, 'UR
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个参数,由大括号中的内容定义
在本例中,对于一系列箭头运算符,我不知道函数def如何同时查看options和req、res中的所有参数
引擎盖下到底发生了什么?这与承诺有关吗?同样,one方法def如何能同时看到所有参数?您显示的代码是以下内容的简写:
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()
}
}
如果调用loggermdleware{enable:true,},它将返回一个新函数functionreq,res,next{…},该函数在options参数上创建一个闭包
这允许此返回函数在这种情况下,中间件可以在每个请求上访问传递的选项对象,而无需污染全局范围
到目前为止,还允许创建两个具有不同选项的中间件:
app.get('/with-logging', loggerMiddleware({
enable: true,
}), function(res, res) {})
app.get('/without-logging', loggerMiddleware({
enable: false,
}), function(res, res) {})
就个人而言,我认为那些选项=>req,res,next=>{构造不是真正可读的,它让我想起了那些奇特的嵌套三元条件运算符::cobination。您显示的代码是以下内容的简写:
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()
}
}
如果调用loggermdleware{enable:true,},它将返回一个新函数functionreq,res,next{…},该函数在options参数上创建一个闭包
这允许此返回函数在这种情况下,中间件可以在每个请求上访问传递的选项对象,而无需污染全局范围
到目前为止,还允许创建两个具有不同选项的中间件:
app.get('/with-logging', loggerMiddleware({
enable: true,
}), function(res, res) {})
app.get('/without-logging', loggerMiddleware({
enable: false,
}), function(res, res) {})
我个人认为下一个选项是res=>{构造不是真正可读的,它让我想起了那些奇特的嵌套三元条件运算符?:协同作用。简单的答案是,它是一个返回另一个函数的函数。有两个函数。第一个函数是logger的值,它有一个参数:选项。只要logger是cal,就会返回另一个函数led。它被称为currying。正如@charlietfl和其他评论中提到的功能。这是一个有人写的博客,特别是ES6中的currying。@Jacob这与currying非常相似。但如果你说currying,通常意味着修复一个或多个需要多个参数的函数参数。简单的答案是这是一个返回另一个函数的函数。有两个函数。第一个函数是logger的值,它接受一个参数:选项。另一个函数在调用logger时返回。它被称为currying。它被称为@charlietfl,注释中的其他函数都提到了该功能。这是有人写的博客特别是ES6中的currying。@Jacob它与currying非常相似。但是如果你说currying,通常是指修复一个函数的一个或多个需要多个参数的参数。好吧,嵌套的ternaries在超过两个表达式条件之后变得非常古怪。我经常使用ternaries,直到最近几天才使用currying f或者我的React组件中的handleClick.,是我唯一能想到的初始化属性的方法。@Jacob闭包和currying很棒。我想说的是functionoption{return req,res,next=>{}或functionoption{return functionreq,res,next{}在大多数情况下比options=>req,res,next=>{.Arrow函数经常被过度使用,仅仅是因为它们很花哨,代码也很短。我不能否认人们太过沉迷于最新的热点。它的进展总是首先让它工作!好吧,嵌套的ternaries在超过两个表达式条件之后变得非常古怪。我经常使用ternaries,直到最近我们才开始使用在我的React组件中,对handleClick进行ed Curring是我唯一能想到的初始化属性的方法。@Jacob闭包和Curring很棒。我想说的是functionoption{return req,res,next=>{}或functionoption{return functionreq,res,next{}大多数情况下比选项=>req,res,next=>{更容易阅读。箭头函数经常被过度使用,只是因为它们很花哨,代码也很短。我不能与人们太过沉迷于最新的热点争论。它的进展总是先让它工作!