您的位置:首页 > Web前端 > JavaScript

js闭包

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

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就不会在函数调用后被垃圾回收机制清除。

要注意在使用闭包的时候尽量不要使用循环语句,这会造成一些错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 闭包