在W3C和网上其他地方看了一下闭包,记录一下个人理解。
个人认为,闭包就是一个函数内包含另一个函数 ,然后函数外可以调用另一个函数内的变量或函数返回值。
看到这,大家都会觉得。还要你说,傻子都知道。
但是,事实就是如此,来段代码
var iBaseNum = 10;
function addNum(iNum1, iNum2) {
function doAdd() {
return iNum1 + iNum2 + iBaseNum;
}
function doReduce(){
return iBaseNum - (iNum1 + iNum2);
}
return doAdd() - doReduce();
}
console.log(addNum(1,1));//4
我就是从这个很简单的闭包开始理解的,定义一个全局变量,再定义一个父函数里面包含两个子函数。
按我刚才的认为,这就是一个函数包含另一个函数,哦不,包含两个函数。这就是闭包。大家可以去运行一下,具体感受一下。
----------------------------------------------2022-10-13分割线------------------------------------------------
五年过去了,回看自己的代码,总是觉得不忍直视,但那也是曾经啊,所以我不打算删掉上面的代码,重新写一下对闭包的理解
进入正题
闭包是什么?
闭包是外部函数嵌入一个内部函数,然后内部函数调用外部函数的变量的函数。
有点绕口,用代码看下就能清晰点
function wrap(age) {
let name = '小明'
function inside(){
console.log(`${name}已经 ${age} 了`)
}
return {inside}
}
let wrapTemp = wrap(18)
wrapTemp.inside() // 小明今年 18 了
上面这个函数 wrap就是外部函数,
然后他内嵌了一个inside函数,
而inside函数又调用了wrap这个外部函数的变量name和参数age
而这就形成了闭包
拓展一下知识
其实我们用对象也能实现类似的功能
let wrap = {
name: '小明',
age: 18,
inside() {
console.log(`${this.name}已经 ${this.age} 了`)
}
}
wrap.inside() // 小明已经 18 了
当然,只当衍生知识了,具体细究就不再列举了,留给大家自己去继续探究了。