js 闭包认识

之所以要提及闭包,是因为它在js的地位是很重要的。同时闭包的概念难以理解,不是一两句话就可以描述的,但这不阻碍对闭包的认识,如果要你对闭包下一个定义,那就不好说了。

按照我的理解。闭包就是指变量在某个作用域上的值,这个变量只在这个作用域上起作用。闭包对变量而言,闭包指某个作用域。

照我的理解分析,那么js处处是闭包啊。就一个简单的

function(){

  var a = "";  

}

 这里就形成了 变量 a 的一个闭包。

我自己也说不清楚闭包的概念,希望不要被我误导,大家保留自己的观点。看别人的理解把。或者有能力的话非常建议看javascript权威指南。

1、权威指南。

javascript函数是将要执行的代码以及执行这些代码的作用域构成的一个综合体。在计算机科学术语里,这种代码和作用域的综合体叫做闭包。所有的javascript函数都是闭包。但就是说,当一个嵌套函数被导出到它所定义的作用域外时,这种闭包才是有趣的。当一个嵌套的函数以这种方式使用的时候,它常常明确地叫做一个闭包。

uniqueID = funcrtion(){
    if(!arguments.callee.id) arguments.callee.id = 0;
    return arguments.callee.id++;
};
这种方法问题在于,任何人都可以更改uniqueID.id。
为了防止这样的问题:
uniqueID = (function(){
    var id = 0;
    return function(){
        return id++;
    }
})();

2、关于闭包,ECMAScript对其进行了简单的描述:允许使用内部函数(即函数定义和函数表达式位于另一个函数的函数体内),而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数,当其中一个这样的内部函数在包含他们的外部函数之外被调用时,就会形成闭包。即内部函数会在外部函数返回后被执行。而当这个内部函数执行时,他然仍必须访问其外部函数的局部变量、参数以及其它内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。

3、http://www.cnblogs.com/rubylouvre/archive/2009/07/24/1530074.html

闭包的定义非常晦涩——闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留它们在闭包最初定义(或创建)时的值(深连结)。简单来说,闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对是不会随上一级函数的执行完成而销毁。周爱民说得更清楚,闭包就是“属性表”,闭包就是一个数据块,闭包就是一个存放着“Name=Value”的对照表。就这么简单。但是,必须强调,闭包是一个运行期概念。

在Javascript中闭包(Closure),有两个特点:

  • 作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
  • 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

4、百度文库。

所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

我在编程中遇到的闭包问题。

在一个循环中分别建立事件。elements[i] 对应事件 events[i]

for(var i = 0 , len < elements.length; i < len ; i ++){

  elements[i].click(function(){

    events[i].call();

  });

}

运行这段代码会发现 无论如何点击都是触发 events[events.length]。而不是我点击elements[0] 就触发events[o]。

这是因为在触发点击事件时,会跑function(){ events[i].call()}。而这时候的 i 的作用域,也就是闭包是这个for循环,因为循环已完,i 为 elements.length。所以就出现上面的情况。

所以我们必须为 i 建立一个闭包

for(var i = 0 , len < elements.length; i < len ; i ++){

  elements[i].click(

    (function(k){

      return function(){

        events[k].call();

      }    

    })(i)

  );

}

这样每个elements[n]就对于与events[n]了

posted @ 2011-08-05 02:11  liyatang  阅读(2518)  评论(0编辑  收藏  举报