闭包的由来
JS中变量是function级作用域,也就是说,在function中定义的变量可以再function内部(包括内部定义的嵌套function中)使用,而在function外部无法使用,但是,js中,函数就是一块保存了现有数据的内存,是要找到这块内存就可以进行调用。因此,如果想办法获取到内部的嵌套函数,就可以在外部使用使用嵌套函数来调用内部定义的局部变量
function f1(){
var v=1
function f2(){
console.log(v)
}
return f2 //关键点
}
var f=f1()
f() //1
函数f1中定义了变量v,正常情况下在f1外面是无法访问v的,但是f1中嵌套定义的函数f2是可以访问v的,而且在调用f1时会返回函数f2,这样就可以在f1外面访问f1的局部变量 v ,这就是闭包,当然,如果需要还可以在f2中直接返回v的值,就可以在f1外部获取v的值。
闭包的另一种种表现
let f;
{
let i={note:'safe'}
f=function(){return i;}
}
let oRef=f();
oRef.note="Danger"
console.log(oRef.note)
//输出Danger
高手文章:
Groovy语法之闭包:https://blog.youkuaiyun.com/tscyds/article/details/77450608
为什么js会有闭包:https://blog.youkuaiyun.com/weixin_36094484/article/details/81164240