js闭包与commjs规范

140 阅读1分钟

闭包定义

js闭包是指函数和创建函数的词法环境组成,该环境包含了闭包创建时作用域内的任何局部变量。
由于在js中只有函数内部的子函数能够访问函数内的局部变量,所以闭包可以理解是定义在函数内部的函数,常见的就是在一个函数中返回一个函数。

function makeFunk() {
  var a = 0;
  return function add(){
  	console.log(++a);
  }
}
var add = makeFunk();add();add();
var add2 = makeFunk();add2();add2();

commonJS规范

最常被问道的问题:module.exports和exports的区别 这个主要得看require的实现方式,就可以明白

// test.js
var a = 0;
module.exports = {
	add: function() {
		console.log('show a', ++a);
	}
}
// req实现
var fs = require('fs');
var path = require('path');
var req = function(path) {
	var content = fs.readFileSync(path, 'utf8');
	let module = {
		exports: {}
	};
	let fn = function(exports, module) {
		eval(content);
		return module.exports;
	}
    module.exports = fn(module.exports, module);
	return module.exports
};
var test = req('./test.js');
test.add();
test.add();
var test2 = req('./test.js');
test2.add();
test2.add();// 输出 1 2 1 2

test里面如果用exports = {xxx},则fn里的exports被重置,跟调用地方的module.exports切断联系了。
每一次引用,都是一份新的数据,互相独立。
如果不给fn传递参数,则就利用了闭包原理。功能一切正常。