闭包定义
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传递参数,则就利用了闭包原理。功能一切正常。