node中的global、exports和module.exports

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的指向就会发生改变

猜你喜欢

转载自blog.csdn.net/Efficiency9/article/details/75947784
今日推荐