1

导出函数时,你可以

 module.exports.foo = function (){}

也可以

exports.foo = function (){}

后者可以少打几个字。对于追求简洁的人来说,这个小特性还是比较招人爱。

你可以设置整个module.exports 为一个函数

module.exports = function (){}

可是,你却不可以这样:

exports = function (){}

想知道原因的话,得假想每个module在装入时,有这样的一段代码

var module = new Module(...);
var exports = module.exports;

是v8在一个js文件内插入两个对象:exports , module.exports,并让exports指向module.exports,这样,对exports属性的任何添加和修改,都会导致module.exports的添加和修改。

可是两者并非完全等效。因为对整个对象赋值的话,效果和我们期望的就不一样了。exports会指向我们的函数,而不再和module.exports有任何关系。然后真正会被V8导出的是module.exports,而不是exports。所以,exports的方式,根本不能整体导出一个没有放到属性中的函数。

真是恼人的不一致。

为此,有些人想到的方法,就是干脆连等:

module.exports = exports = foo = function foo() {...}

这样的boilerplate ,常常可以在模块开发代码中看到,有点古怪,却自有它的道理


Reco
4.6k 声望541 粉丝

敢作敢为