node.js的global variable,和module.exports
global
javascript的语言特性决定了,一定会有一个顶层对象(top object),但是根据执行环境的不同,这个顶层对象是不一样的。由执行环境决定,比如在浏览器执行环境中,顶层对象是window。而在node里,顶层对象是global
global里定义了一些全局的对象或函数,在node的任何一个模块里,都可以直接使用,比如console,setTimeout(),require()等,完整的global object document见:node.js global objects
如果想在不同的模块(文件)之间共享变量,有一个可行但是很糟糕的做法,就是借助这个global object,在global上定义的属性和函数,在任何模块里都可以访问到
所以不管用exports还是module.exports,给这个object添加属性或函数,都是完全等效的
而node导出的,永远是module.exports指向的对象,在这里就是function。所以exports指向的那个object,现在已经不会被导出了,为其增加的属性当然也就没用了
如果希望把sex属性也导出,就需要这样写:
所以我感觉exports根本是多余的,最终只会导出一个object,却设计了2个引用,很多时候反而会造成迷惑。exports的唯一好处就是可以少敲几个字,还不如只保留module.exports就好了
exports的缓存
执行require之后,目标模块的代码会被完整地执行一次,然后module.exports对象被返回
需要注意的是,这个过程只会发生一次,后面重复的require,只会拿到同一个对象