每个js文件都独立运行在一个闭包中
在Node中,每个js文件都独立运行在一个闭包中,不是全局的作用域,模块与模块无法互相访问。
目的是:全局变量私有化,避免全局污染
//将暴露给外部的变量或者方法设置为exports属性
exports.sum = (...numbers) => {
let result = 0;
numbers.forEach((item) => {
resulet += item;
});
return result;
}
//在其他文件中通过require引入模块
let func = require("./sum.js");
func.sum(1, 2, 3);
//核心模块直接写名称,外部文件模块加路径 ./ 当前 ../上级
exports和require是函数参数
exports
和require
是函数参数,不是全局对象。
在node的全局对象是global
,和window
类似
判读函数的标识:arguments
获取函数本身 arguments.callee
Console.log(arguments.callee + ""); //转义成字符串
输出:function (exports, require,module,__filename,__dirname){ … }
exports 和 module.exports的区别
exports === modu'le.exports
exports
只能使用.
语法来向外暴露内部变量 exports.xxx = xxx;
Module.exports
既可以通过.语法,也可以直接赋值一个对象
- module.exports 初始值为一个空对象 {}
- exports 是指向的 module.exports 的引用
- require() 返回的是 module.exports 而不是 exports
有这样一句语法:
exports = module.exports = {...}
原理很简单:module.exports
指向新的对象时,exports
断开了与 module.exports
的引用,那么通过 exports = module.exports
让 exports
重新指向 module.exports
。
有一个小例子:
var a = {name: 1}
var b = a
console.log(a)
console.log(b)
b.name = 2
console.log(a)
console.log(b)
var b = {name: 3}
console.log(a)
console.log(b)
运行的结果为:
{ name: 1 }
{ name: 1 }
{ name: 2 }
{ name: 2 }
{ name: 2 }
{ name: 3 }
解释:a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一块内存,所以前两个输出一样。当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。当 b 被覆盖时,b 指向了一块新的内存,a 还是指向原来的内存,所以最后两个输出不一样。