概念:有權訪問兩一個函數作用域中的變量的函數--->能夠讀取其他函數內部變量的函數
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、存儲變量: