JavaScript闭包(Closure)

1
2
3
4
5
6
7
8
9
function f1(){
    var n=999;
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999

上面代码产生了闭包

闭包的概念

下面是一些官方的概念

函数与对其状态即词法环境lexical environment)的引用共同构成闭包closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。在JavaScript,函数在每次创建时生成闭包。

闭包closure)是指有权访问另一个函数作用域中变量的函数

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

但不要咬文嚼字,我们简单的可以理解为

闭包是个函数,而它「记住了周围发生了什么」。表现为由「一个函数」体中定义了「另个函数」

通俗的理解

闭包 就是 能够读取 其他函数 内部(局部)变量 的函数。

上面代码中 f2 可以访问 f1 的 n变量 也就是局部变量,于是产生了闭包,f2就是闭包函数


闭包的作用

主要作用:延申了变量的作用范围

它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。(等所有的函数调用完了 才会销毁)

使用闭包的注意点

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。


闭包经典案例

代码片段二。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()()); //The Window

代码片段二。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };

    }

  };

  alert(object.getNameFunc()()); //My Object

https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html


 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×