闭包的一点理解

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 }
           

  

 

 

以上是关于闭包的一点理解的主要内容,如果未能解决你的问题,请参考以下文章

对于闭包的一些理解

javascript 匿名函数及闭包----转载

深入理解javascript闭包

javascript闭包的理解

JS---闭包

JS闭包