JS 闭包

129 阅读1分钟

今天记录一下JS中有关闭包的部分,如果有不对的地方,欢迎留言!

闭包的定义

一个可以访问其他函数内部变量的函数。

定义是标准的总结,需要各位牢记。

闭包的概念

闭包是JS中的一个难点,最简单的写法是,一个函数中返回另一个函数,如下所示:

// 示例1
function fn1() {
    var a = {};
    retunn function fn2() {
    }
}
var fn = fn1()

在上述的 ‘示例1’ 中,执行完函数 fn1 后,返回了一个函数 fn2,这种写法就是闭包,当然闭包也还有很多变化后的写法。

闭包的特性

  • 存储变量——在 ‘示例1’ 中,函数 fn 是接收到的函数 fn2,如果在 函数fn中,每次都修改声明的变量 a,那么每次执行,修改的都是同一个变量
  • 内存泄漏——因为闭包有做变量存储的特性,所以在函数不在使用之后,存储起来的变量还是会占用着一定的内存,并不会消失,所以会产生内存泄漏的问题。但是大部分情况下,并不会对程序造成很大的影响。

闭包的使用

在vue源码中有一种使用方式,用于判断当前的标签是否为原生标签。大概写法如 ‘示例2’。利用闭包封装了一个公共函数judge,后面根据这个函数生成了多个用于判断的函数。

// 示例2
function judge(cond) {
    return function(cont) {
        if(cond.indexOf(cont) !== -1) {
            return true;
        }
        return false;
    }
}

// 判断是否为标签
const judgeDom(['html','body','div','meta', ...])

// 判断是否为指定数字
const judgeNum([1,2,3, ...])