闭包是能访问其他函数作用域内变量的函数
function name() {
var num = 0
var val = function() {return num++}
return val
}
var a = name() // 返回的 val
a() // 在 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 name
p.getName2()() // win name
相当于
var a = p.getName()
a()this 是词法作用域
var b = p.getName2()
b() 是全局作用域