才发现一个有用的知识:Function.length

最近看express.js,发现其example里有这样两段代码,顿生疑惑,回调函数省略后面的参数好理解,但是如何做到自由省略前面的参数呢?两段有疑问的代码如下:

app.use(function(req, res, next){
    // ... 省略
});
app.use(function(err, req, res, next){
    // ... 省略
});

可以看到,err这个参数是如何被省略掉的呢?曾有答案说是用arguments.length,但是显然不适合这个场景。arguments是运行时才能获取,现在这个却是运行前(定义时)的场景。

没人解答,于是去看express源码,从expressjs的application.js跟踪到connect.js,最终在connect lib中的proto.js找到答案,摘片段代码如下:

debug('%s', layer.handle.name || 'anonymous');
var arity = layer.handle.length;
if (err) {
  if (arity === 4) {
    layer.handle(err, req, res, next);
  } else {
    next(err);
  }
} else if (arity < 4) {
  layer.handle(req, res, next);
} else {
  next();
}

于是学到了Function.length这种在运行前就获知回调函数有多少个参数的方法。还有Function.name。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章