概念:有权访问两一个函数作用域中的变量的函数--->能够读取其他函数内部变量的函数
function demo () {
var top = '';
function c() {
xxx.innerHTML = top;
}
}
闭包在工作中的使用:
1、封装私有变量:(amd框架在使用)
(function () {
var Person = function() {
this.money = 100000000;
}
Person.prototype.buy = function () {
this.money -= 100;
console.log('left money ' + this.money + ' <br />');
}
let xiaoming = new Person();
xiaoming.buy();
// 这个时候,如果有个函数改变了xiaomign的money值,那么money就是外面可以访问的
// 相当于一个对象它的属性外部可以去改
function xiaomingWifeSearch() {
xiaoming.money = 0;
}
xiaomingWifeSearch();
xiaoming.buy();
})();
上面的问题可以用闭包来解决:
(function () {
var Person = (
function (params) {
var _money = 100000000;
function Person() {
// 这里放公有的变量
}
Person.prototype.buy = function () {
_money -= 100;
console.log('left money ' + _money + ' <br />');
}
return Person;
}
)()
let xiaoming = new Person();
xiaoming.buy();
// 这个时候,如果有个函数改变了xiaomign的money值,那么money就是外面可以访问的
// 相当于一个对象它的属性外部可以去改
function xiaomingWifeSearch() {
xiaoming.money = 0;
}
xiaomingWifeSearch();
xiaoming.buy();
})();
但是上面的代码依然存在问题:比如
(function () {
var Person = (
function (name) {
var _money = 100000000;
function Person(name) {
// 这里放公有的变量
this.name = name
}
Person.prototype.buy = function () {
_money -= 100;
console.log(this.name + 'left money ' + _money + ' <br />');
}
return Person;
}
)()
let xiaoming = new Person('xiaoming');
xiaoming.buy();
let xiaohong = new Person('xiaohong');
xiaohong.buy();
})();
所有对象公共一个属性,var _money = 100000000; // ==> 静态私有变量
2、存储变量: