什么是JavaScript闭包?闭包的使用场景?

一、闭包是什么?

闭包(closure)是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数),从本质上讲,闭包就是将函数内部和函数外部连接起来的桥梁。闭包最典型的应用是实现回调函数(callback)

二、闭包的优缺点以及闭包的特性

优点:

  • 保护函数内变量的安全
  • 可以重复使用变量,并且不会造成变量污染
  • 方便调用访问上下文的局部变量
  • 可以用来定义私有属性和私有方法
    缺点:
  • 常驻内存中,会增大内存使用量,使用不当很容易造成内存泄漏。
  • 会造成内存的浪费,这个内存浪费不仅因为它长期存在于内存中,更因为对闭包的使用不当会造成无效内存的产生
    特性:
    1、函数嵌套函数
    2、内部函数可以访问外部函数的变量
    3、参数和变量不会被回收

三、变量的作用域

要想理解闭包,仅仅理解上边所说的闭包的概念是不行的,首先要理解JavaScript的变量的作用域:
1、变量的作用域分两种:全局变量和局部变量;
2、函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量;
3、需要注意的是在声明变量的时候,一定使用命令 var、const、let命令(const和let命令hui变量名的提升而var命令会存在变量名的提升),不然的话声名的变量是一个全局的变量。

四、使用例子解释闭包

function a () {
   var i = 0;
   function b () {
      alert (i++);
   }
  return b;
}
var c = a();
c();  //函数调用

上边代码的解释:这段代码有两个特点:1、函数b嵌套在函数a内部; 2、函数a返回函数b。这样在执行完var c = a( )后,变量c实际上是指向了函数b,再执行c( )后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包,这是因为函数a外的变量c引用了函数a内的函数b。也就是说,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。

五、闭包的用途

1、setTimeou():原生的setTimeout传递的第一个函数不能带参数,通过闭包可以实现传参效果。
2、回调:定义行为,然后把它关联到某个用户事件上(点击或者按键)。代码通常会作为一个回调(事件触发时调用的函数)绑定到事件。
3、函数防抖:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。实现的关键就在于setTimeOut这个函数,由于还需要一个变量来保存计时,考虑维护全局纯净,可以借助闭包来实现。
4、封装私有变量

六、使用闭包时的注意点

1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2、闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

你可能感兴趣的:(javaScript闭包,javascript)