js闭包

来源:互联网 发布:js注释 提示 编辑:程序博客网 时间:2024/06/10 11:07

之所以有闭包这个概念,其实是因为变量作用域的问题。我们都知道变量的作用域分为全局作用域和局部作用域。全局变量可以在函数内部读取,在外部却不可以读取函数内部的局部变量。然而出于各种原因,有时候我们需要读取函数内的局部变量。一般情况下是不能这样做的,我们可以取巧,就是在函数内部再定义一个函数,返回变量的值:

function f1(){    var n=999;    function f2(){      return n; // 999    }return f2;

return f2;result = f1();result(); // 999


这样就能在外部读取函数内的变量了。所有具有链式作用域的语言都有闭包这个概念。如果不用想太复杂的话,可以简单的把闭包想象成函数内部的函数,就是把函数外部和内部链接起来的桥梁。

闭包的作用主要有两个,第一个就是读取内部变量,第二个就是把变量的值储存在内存中。

我们都知道如果定义一个函数,每次创建一个实例对象时,由于有垃圾回收机制,都会把函数内变量的值清除,每次都会对对象进行初始化。但是如果使用闭包,例如:

function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000
这里运行了两次,可以看到n的值变成了1000,没有被清除。这是因为我们把f1赋值给了全局变量result,而f1就是f2的父函数,所以f2就一直存在于内存中,因此它的父函数f1也就存在内存中,局部变量n就不会在函数调用后被垃圾回收机制清除。

要注意在使用闭包的时候尽量不要使用循环语句,这会造成一些错误。