问题引出
存在问题:局部变量无法共享和长久的保存,而全局变量可能造成变量污染
目的:当我们希望有一种机制既可以长久的保存变量又不会造成全局污染
存在问题
//全局变量会造成变量空间的污染
var a = 10;
function f1(){
var b = 100;
}
//局部变量无法长久保存,每次执行函数都会重置a
function f1(){
var a = 10;
a++;
return a;
}
f1(); //11 11 11 11 11
//每一次执行f1() 都将重新创建变量a,并没有维持a的状态
改进方法1
var a = 10;
function f1(){
a++;
return a;
}
f1(); //11 12 13 14
改进方法2
function f1(){
var a=10;
function f2(){
a++;
console.log(a);
};
return f2;
};
//另一种写法:
// function f1(){
// var a=10;
// return function(){
// a++;
// console.log(a);
// };
// };
f1()() //11 11 11 11
var f = f1(); //相当于把f1执行的结果赋给了一个全局变量f,导致f2始终在内存中没有回收,f2依赖于f1,所以f1不会在调用后回收
f(); //11 12 13 14
反例
function f1(){
var a = 10;
a++;
return a;
}
var f11 = f1;
f11(); //11 11 11 11 相当于重新执行f1
实际作用(实例)
对象封装 获取/修改name缓存
function person(){
var name = 'abc';
return {
getName:function(){
return name;
},
setName:function(newName){
name = newName
}
}
};
var person = person();
//获取局部变量name
person.getName(); //abc
//改变局部变量name
person.setName('xyz');
person.getName(); //xyz
//另一种写法 直接把函数赋给变量
// var person = function(){
// var name = 'abc';
// return {
// getName:function(){
// return name;
// },
// setName:function(newName){
// name = newName
// }
// }
// }();
// person.getName(); //abc
// //改变name
// person.setName('xyz');
// person.getName(); //xyz
}