闭包

2018-08-03  本文已影响0人  码课sir

什么是闭包

闭包:闭包是指有权访问另一个函数作用域中的局部变量的函数
即在JavaScript中仅可以通过闭包函数才可以访问某个函数内的局部变量。
(类似于php中只能通过public公有的方法来访问类中private私有属性)

function A(){
   var a = 10; //函数内的局部变量a
   function B(){
       console.log(a);
   }
   return B; //返回函数B  
}
var result = A();  // result是function B
result();  //   10

解释:
由于函数A内部的局部变量a不能被A以外的函数访问到,只能被A内部的子函数B访问到,这是由于JavaScript的‘链式作用域’结构导致的,既然只有内部函数B才可以访问到函数A中的局部变量,那么我们只需要把函数B作为函数A的返回值,就可以在函数A外部访问它的内部变量a! 其中函数B就是闭包。

问题,如何创建闭包?

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在一个函数内部创建子函数,最后返回子函数,这是创建闭包最常见的方式。

严格来说,JS中所有的function都是闭包,一般来说,嵌套的function的闭包性更强。这也是我们平时接触和研究较多的地方。

闭包的作用

主要以下两个作用:
可以让我们在全局作用域中访问函数内的局部变量。(类似于php中访问类中的私有属性)。
保持对函数内部的变量持续引用,程序执行完毕前,可让局部变量一直驻留在内存中不销毁。

怎么理解“保持对函数内部的变量持续引用,脚本执行完毕前,让一个变量始终保存在内存中,让一个变量始终(一直)保存在内存中”这句话呢

请看以下代码:

function A(){
       var a = 10;
       function B(){
           console.log(a++);
       }
       return B; //返回闭包函数B的函数体
}
  var result = A();
  result();  // 
  result();  // 
  result();  // 

解析:
上面调用A函数把返回的结果赋值给变量result,变量result就是就是闭包B函数,它一共运行了三次,第一次的值是10,第二次11,第三次12,这说明函数A内的局部变量a一直保存在内存中,因为在javascript中,函数中的局部变量仅在函数执行的期间可用。一旦函数A()执行完毕,其内部的局部变量将不能被访问。这说明局部变量a并未在函数A()执行完毕后被销毁,导致程序执行完毕之前一直驻留在内存中。

上一篇 下一篇

猜你喜欢

热点阅读