先来看一段代码
function ta(){
var age = 20;
function tb(){
alert(age);
}
return tb;
在c语言中 ta被调用执行,则申请内存并把其局部变量push入栈 执行ta后 栈的内存被释放 (LIFO)ta内的局部变量 应该全部都释放了
然而在js中,ta执行过程中生成了tb,而从作用域上来说 tb能访问到 age= 20 于是 age = 20
并没有消失,即使ta执行完毕 通过tb依旧能访问该变量 而是于返回的ta函数形成了一个环境包,这个包属于tb 所以叫闭包(具体原理要结合预编译等知识,本文不展开)
用一句话概括 函数的作用域取决于声明时 不取决于调用的时候
,闭包怎调用和外界无关
function counter(){
var cnt = 0;//当counter执行完毕后,除了返回的center函数 谁也别想碰到cnt变量了
var center = function cnter(){
return ++cnt;
}
return center;
}
var inc = counter();
alert(inc());
简化
var cnt = (function (){
var cnt = 0;
return function(){
return ++cnt;
}
})();
然而 cnt依旧是全局变量 在实际操作中如何避免全局污染和冲突呢?
1:统一放在一个全局对象上 如jquery -》$
2:每个人用自己的命名空间
闭包只能取得包含函数中任何变量的最后一个值
1 function createFunctions(){
2 var result = new Array();
3
4 for(var i = 0; i<10;i++){
5 result[i]=function(){
6 return i
};
7 }(i);
8 }
9 return result;
10 }
// 这个函数每个函数都返回 10 因为每个函数都保存
createFunctions的活动对象 所以引用的都是同一个变量i
我们可以通过创建一匿名函数的强制让闭包的型号为符合预期
1 function createFunctions(){
2 var result = new Array();
3
4 for(var i = 0; i<10;i++){
5 result[i]=function(num){
6 return function(){
return num;
};
7 }(i);
8 }
9 return result;
10 }
原文:http://www.cnblogs.com/lik98/p/7841321.html