闭包的一点理解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了闭包的一点理解相关的知识,希望对你有一定的参考价值。
先来看一段代码
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 }
以上是关于闭包的一点理解的主要内容,如果未能解决你的问题,请参考以下文章