Node模块化概念

每个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是函数参数

exportsrequire 是函数参数,不是全局对象。
在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既可以通过.语法,也可以直接赋值一个对象

  1. module.exports 初始值为一个空对象 {}
  2. exports 是指向的 module.exports 的引用
  3. require() 返回的是 module.exports 而不是 exports

有这样一句语法:

	exports = module.exports = {...}

原理很简单:module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,那么通过 exports = module.exportsexports 重新指向 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 还是指向原来的内存,所以最后两个输出不一样。

猜你喜欢

转载自blog.csdn.net/lochoto/article/details/83087589