闭包函数的使用

266 阅读3分钟

JavaScript闭包函数

前言

闭包(closure)是 JavasSript 的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。

1234.jpg

在JavaScript中使用闭包函数

1.我们首先要知道什么是闭包函数?它的作用是什么?

2我们又该如何判断闭包函数?

3.闭包函数的优缺点是什么?

4.闭包函数又存在哪些问题?

一、闭包函数及其作用

认识闭包函数

闭包函数,通俗一点来讲就是可以在函数外部访问到函数内部的变量,通常就是函数嵌套函数的结构,这是形成闭包的其一必要条件。另外,作为闭包的重要条件之一,内部函数应该访问外部函数中声明的私有变量,参数,或者其他内部函数。满足上述两种必要条件,此时外部函数外调用内部函数,它就会成为一个闭包函数。

闭包函数的作用

列一些简单的小例子

1.我们在性能优化的过程中,使用节流防抖函数就是闭包原理,导航栏获取下标的使用。

2.项目后期的时候进行了一定的性能优化。比方说:对级联菜单的功能适用房都节流的方式,减少了HTTP请求。等一些操作

二、如何表象判断是不是闭包函数

  1. 函数是不是嵌套结构,就比如在一个函数中再定义一个函数的这种嵌套格式,内部函数被return
  2. 所定义的内部函数可以调用外部函数的局部变量
function a(){
	let j = 10
	let i = 10
	console.log(i+j);  //打印20
    //初始化b
    let b = function(){
       //里面的方法,用到了外面方法定义的变量
       //所以,i会一直存在于内存中
       //这样的函数,我们又称之为:闭包函数
       i += 5  
       console.log(i);
       console.log('HelloWorld');
   }
       //a方法,返回b,而b也是一个方法
       //方法的返回值是方法,这样的方法:也称之为,高阶方法。
       return b    //返回b
}
       let c = a()
       c()
       c()

三、闭包函数的优缺点

优点

1. 逻辑连续,当闭包作为另一个函数调用的参数时,避免你脱离当前逻辑而单独编写额外逻辑。
2. 方便调用上下文的局部变量。
3. 加强封装性,第2点的延伸,可以达到对变量的保护作用。

缺点

函数执行完毕后,函数内的局部变量没有释放,占用内存的时间会变长。或者说是闭包长时间驻留 内存,长期这样会导致内存泄露。

四、闭包函数所存在的问题及解决方式

内存泄露问题

出现内存泄露的原因主要有以下几点:

  1. 占用的内存没有及时释放
  2. 内存泄漏积累多了就容易导致内存溢出

常见的内存泄露:

  1. 意外的局部变量

  2. 没有及时清理的计时器或 回调函数(回调就是一个函数的调用过程。那么就从理解这个调用过程开始吧。函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调)

//这段代码会导致内存泄露
    window.onload = function(){
        var el = document.getElementById("id");
        el.onclick = function(){
            alert(el.id);
        }
    }
  

引用的变量可能发生变化

function onter() {
      var result = []
      for (var i = 0;i<10;i++){
        result[i] = function () {
            console.info(i)  //因为每个闭包函数访问变量i是outer执行环境下的变量i,
            //随着循环的结束,i已经变成10了,所以执行每个闭包函数,结果打印10,...,10
        }
     }
     return result
}

function onter() {
      var result = []
      for (var i = 0; i<10;i++){
        result[i] = (function (num) {
             return function() {
                   console.info(num);   // 此时访问的num,是上层函数执行环境的num,
                   //数组有10个函数对象,每个对象的执行环境下的number都不一样
             }
        })(i)
     }
     return result
}

以上就是一些我对于闭包函数内容的整理。