码迷,mamicode.com
首页 > 其他好文 > 详细

闭包的一点理解

时间:2017-11-15 23:34:12      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:center   query   一个   new   全局对象   包含   作用   res   内存   

先来看一段代码

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 }
           

  

 

 

闭包的一点理解

标签:center   query   一个   new   全局对象   包含   作用   res   内存   

原文地址:http://www.cnblogs.com/lik98/p/7841321.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!