为什么要有闭包?什么是闭包?我这个小白也就懂了这点,写的不对的欢迎留言

68 阅读2分钟

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.使用不当造成内存泄漏。

有哪些闭包?
  1. callback函数
  • > > 以上仅仅是我个人理解,如有不当,还请联系我删除或者修改