global
javascript一定会有一个顶层对象,在浏览器环境中,顶层对象是window,这意味着在浏览器中var something就会定义一个全局变量。而在node中,顶层作用域并不是全局作用域,在node模块中使用var something 只是就只局限在当前文件中的作用域中。node中的顶层对象是global,通过var 定义的变量也是global的属性。
global是什么?打开一个终端,输入node,再输入global,你会发现global实际上是一个庞大的对象,所有其他对象都是依附在global上。
.global和var的区别–在你创建的模块中,用var 声明的变量只属于这个模块,不能被其他模块调用,而global是可以被其他模块调用。
-声明方式
- name == global.name == GLOBAL.name
- 我们可以通过上面的三种方式声明全局变量
不要过度使用全局变量,以免造成污染
module
当前模块的引用。 具体地说,module.exports 用于定义一个模块导出什么,且通过 require() 引入。
module 实际上不是一个全局变量,而是每个模块内部的。在模块里用var声明的变量,全部都是在module作用域里的,优先于global作用域的属性
global.name = "liang";
require("./b");// 执行b.js里的代码
var name = "xiao";
console.log(name);// xiao
module.exports和exports
-如果我们想要不借助global,在不同模块间共享代码,需要用到exports属性,但是在node中,还有一个module.exports属性
不管用exports还是module.exports,给这个object添加属性或函数,都是完全等效的
exports.name = "Tony";
module.exports.age = 33;
var b = require("./b");
console.log(b);// {name:"Tony", age:33}
- 所以如果只是给对象添加属性,不改变exports和module.exports的引用目标的话,是完全没有问题的
module.exports = function (name, age) {
this.name = name;
this.age = age;
}
exports.sex = "male";
var Person = require("./b");
var person = new Person("Tony", 33);
console.log(person);// {name:"Tony", age:33}
console.log(Person.sex);// undefined
node导出的,永远是module.exports指向的对象,在这里就是function。所以exports指向的那个object,现在已经不会被导出了,为其增加的属性当然也就没用了
- 如果希望把sex属性也导出,就需要这样写:
exports = module.exports = function (name, age) {
this.name = name;
this.age = age;
}
exports.sex = "male";
注意,就像任何变量,如果一个新的值被赋值给 exports,它就不再绑定到 module.exports
module.exports方法还可以单独返回一个数据类型,而exports只能返回一个object对象,当我们需要返回一个数组、字符串、数字、函数等时,必须用module.exports
我的理解是当export定义的类型与module.exports定义的不一致时,exports的指向就会发生改变