javascript-闭包学习笔记

以前讲闭包,只能死记硬背,不能理解,这几天看到了阮一峰老师的闭包笔记,对闭包加深了理解,做个笔记

一、变量的作用域

变量作用域:全局变量和局部变量。
javascript比较特殊,函数内部可以直接读取全局变量。
var n = 90;
function f1() {
  alert(n)
}
f1(); // 90
 
但是另一方面,函数外部自然是无法读取函数内的局部变量。
function f1() {
  var n = 90;
}
alert(n); // error
注意:这边在函数内部声明变量的时候,一定要用const|let|var命令,否则就是声明一个全局变量。
 
二、如何从外部读取局部变量
有时候我们需要得到函数内的局部变量,但是前面说过,正常情况下,函数外部是无法读取函数内的局部变量,只有通过变通方法才能实现。
那就是在函数内部,在定义一个函数。
function f1() {
  var n = 90;

  function f2() {
    alert(n);
  }
}
 
思考上述代码,函数f2是在f1中的,此时f1中的函数,对f2都是可见的,既然f2可以读取f1的局部变量,那么只要把f2作为返回值,我们就可以在外部读取它的内部变量。
function f1() {
  var n = 999;
  function f2() {
    alert(n);
  }

  return f2;
}

var result = f1();
result(); // 999

三、闭包的概念

上面的f2函数,就是闭包,闭包是一个函数,能够读取其他函数内部变量的函数,闭包可以是函数内部和函数外部连接的一座桥梁。

 
四、闭包的用途
闭包最大的两个用途:
1、可以读取到函数内部的变量。
2、就是让这些变量的值始终保持在内存中。
 
function f1(){

    var n=999;

    nAdd=function(){n+=1}

    function f2(){
      alert(n);
    }

    return f2;

  }

  var result=f1();

  result(); // 999

  nAdd();

  result(); // 1000
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
 
 

参考连接:https://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

原文地址:https://www.cnblogs.com/yxfboke/p/12842834.html