1. 为什么要有闭包?先来看段代码
function fun1(){
let num = 0
}
let result = fun1()
console.log(result());
` Uncaught ReferenceError: num is not defined at test6.html:19:21`
报错啦! 函数外部访问不到fun1()中的变量num,为了能够访问得到fun1()中的变量num,于是就有了closure闭包
2.什么闭包?上代码
function fun1(){
let num = 0
function fun2(){
console.log(num);
return num
}
return fun2
}
let result = fun1()
console.log(result());
` 0 `
函数以外为了能够访问到fun1中的变量num,我们借助fun2这个函数,fun2可以访问到fun1中的变量num,fun1()再返回fun2(),于是就访问到了num,所以fun2()就是个闭包
3.那些属于闭包现象,特性?
1.函数嵌套函数;2.内部函数使用外部函数的参数和变量;3.参数和变量不会被垃圾回收机制回收。
(1).闭包就是函数,一个函数可以访问别的函数作用域里面东西的函数
里面的函数可以访问外面的,外面的访问不到里面的
function f(){
a = 5
function g(){
console.log(a);
}
return g()
}
def f():
a = 5
def g():
print(a)
...
g()
...
g()访问f()里面的变量a,那么g()就是闭包,f() return g()同时也return了g()所携带的变量a
(2).闭包函数不会相互影响
def f():
a = 0
def visit():
print(a)
...
def add():
nonlocal a
a += 1
return visit,add
add_fun,v_fun = f()
add_fun()
v_fun()
add_fun()
add_fun()
`
0
1
1
`
(3)闭包函数的变量是独立不冲突的
def f():
a = 0
def g():
nonlocal a
a += 1
print(a)
...
return g
g1 = f()
g2 = f()
g1()
g1()
g1()
g2()
g2()
`1
2
3
1
2
`
g1不会影响g2
(4).闭包函数只携带他自己访问到的东西
function f(){
a = 0
b = '张三'
c = '李四'
function g(){
console.log(a,b);
}
return g
}
let result = f()
console.log( result());
` 0 '张三'`
(5)闭包函数内再定义一个闭包
def f():
a = 0
def g():
b = 1
def h():
print(a,b)
return h
return g
g1 = f()
h1 = g1()
g2 = f()
h2 = g2()
h1()
h2()
闭包=环境+控制:g1()携带f()的环境,h1()携带g1()环境=h1拥有g1+h1的环境,h1()和h2()互不影响,因为是深拷贝,所以内存地址都不一样
闭包的好处:
1.希望一个变量长期保存内存中; 2.避免全局变量污染; 3私有成员的存在。
闭包的缺点:
1.常驻内存,增加内存使用量; 2.使用不当造成内存泄漏。
有哪些闭包?
- callback函数
-
> > 以上仅仅是我个人理解,如有不当,还请联系我删除或者修改