闭包是能访问其他函数作用域内变量的函数

function name() {    var num = 0    var val = function() {        return num++    }    return val}var a = name() // 返回的vala() //在window作用域下执行

可以得到name函数内部name的值

闭包涉及到作用域和内存问题
一般我们在函数内部的局部变量会在应用完之后被垃圾回收机制回收。但是如果闭包存在,也就是说,函数内部的变量被外部全局变量调用了,全局变量存在,闭包内部的变量就不会被回收,不当的使用就会造成内存溢出的情况。

所以上面执行a()后 0 再执行a() 是1 num被一直存在内存中得不到释放,想要将其释放,a = null

这里还涉及到了匿名函数 和 箭头函数的区别 或者说是this的指向问题

var name = 'win name'var p = {    name: 'p name',    getName: function() {        return () => {            return this.name        }    },    getName2: function() {        return function() {            return this.name        }    }    }p.getName()() // p namep.getName2()() // win name

相当于
var a = p.getName()
a()this是词法作用域

var b = p.getName2()
b() 是全局作用域