关于闭包和模块的一些东西
2020-11-24 本文已影响0人
醋留香
1. 先谈谈闭包
全局变量会污染环境, 这个都清楚
加入你定义的一个数组变量叫 arr, 你能确保别人的数组变量不再用这个名字了么?
如果不想污染全局环境, 只能将变量做成局部的
function addToArr(element) {
var arr = [];
arr.push(element);
return element + " added to " + arr;
}
var firstPass = addToArr("a");
var secondPass = addToArr("b");
console.log(firstPass); // a added to a
console.log(secondPass); // b added to b
但是这样写的话, 就会有另外一个问题,
虽然 arr 变量不会污染全局环境了, 但是, 每次调用 addToArr 函数的时候, arr 都是一个新的空数组, 不能持续!!!
所以 我在这想达到的效果就是, 即让 arr 做成局部的, 又要让 arr 不丢之, 不被重置.
此时, 我们可以把 内部的 push 动作包装成一个函数并返回, 所以就有了下面的代码:
function addToArr() {
var arr = [];
return function push(element) {
arr.push(element);
console.log(arr);
};
}
var result = addToArr();
result("a"); // [ 'a' ]
result("b"); // [ 'a', 'b' ]
在此, 可以把这种情景称为 "闭包": 一个能够记住其环境变量的函数!!!
内部函数必须是一个封闭(外部)函数的返回值。这种也称为工厂函数。
下一步, 我们再把内部函数匿名一下:
function addToArr() {
var arr = [];
return function(element) {
arr.push(element);
return element + " added to " + arr;
};
}
var closure = addToArr();
console.log(closure("a")); // a added to a
console.log(closure("b")); // b added to a,b
ok, 这样做就解决我们的需求了
但是js中闭包的真正目的是什么呢?
- 提供私有的全局变量
- 在函数调用之间保存变量(状态)
JS中闭包最有趣的应用程序之一是模块模式。在ES6之前,除了将变量和方法封装在函数中之外,没有其他方法可以模块化JS代码并提供私有变量与方法。
闭包与立即调用的函数表达式相结合 是至今通用解决方案。堪称完美☺
var Person = (function(){
// do something
})()
接下来说一下如何"私有化"变量和方法:
var Person = (function() {
var person = {
name: "",
age: 0
};
function setName(personName) {
person.name = personName;
}
function setAge(personAge) {
person.age = personAge;
}
})();
很棒, 外部再也不能访问 person 变量 和 setName 和 setAge 这些东西了, 真是真真正正的实现的"私有化"
如果你想公开谁, 就可以返回谁
如果想公开多个, 可以返回一个包含对私有方法引用的对象。
var Person = (function() {
var person = {
name: "",
age: 0
};
function setName(personName) {
person.name = personName;
}
function setAge(personAge) {
person.age = personAge;
}
return {
setName: setName,
setAge: setAge
};
})();
好了 你很棒, 到此为止, 模块的雏形已经被你掌握了, 剩下的, 可以在来聊点关键字问题了 😁