闭包的相关属性

本文深入探讨JavaScript中的闭包概念,包括定义、类型、特性及应用。闭包是一种有权访问外部函数作用域变量的函数,可用于封装数据、跟踪变量变化等。它通过作用域链实现对变量的持久访问,即使外部函数执行完毕,闭包仍然可以保留其状态。闭包在内存管理上可能消耗更多,因此使用时需谨慎。文章还介绍了闭包在函数式编程和数据管理中的实用示例,以及其底层的作用域链原理。
摘要由CSDN通过智能技术生成

一 闭包
    1 定义:有权访问另一个函数作用域中的变量的函数
    缺点:闭包比其它函数占用更多内存,不要过多的使用
    2 闭包有哪些
    (1) 通过作用域链在全局环境中查找变量x,fn1()就是闭包
    var x = 1
    function fn1(){
        laert(1)
    }
    fn1()

    (2)嵌套在fn1中的fn2就是闭包 
    -------即访问上层函数的作用域中的内层函数就是闭包
    function fn1(){
        var x = 1
        function fn2(){
            alert(x)
        }
        fn2()
    }

    (3)fn2 在 fn1 函数的作用域中声明,在全局作用域中被调用 fn2就是闭包
    -------指在函数声明的作用域以外的地方被调用的函数,需要通过将该函数作为返回值或参数传递,叫闭包
    function fn1(){
        var x =1
        function fn2(){
            alert(x)
        }
        return fn2
    }
    fn1()()

    function fn1(){
        var x = 1
        function fn2(){
            alert(x)
        }
        fn3(fn2)
    }
    function fn3(n){
        n()
    }
    fn1()

    3 闭包的特性
    (1) 自闭
    ------
     var x = 1
    function fn1(){
        laert(x)
        var x = 2
    }
    fn1()
    alert(x)
    (2) 包裹特性
    [1] 普通函数调用完毕后系统会自动注销函数,释放资源
    [2] 闭包结构 当外部函数被调用后 闭包函数依然被保存在系统中 从而实现包裹数据的目的 
    function fn1(a){
        var x = a
       var y =  function fn2(){
            return x
        }
        return y
    }
    var c = fn1(1)
    laert(c)  // fn2
    m = c()
    alert(m)
    alert(m) // 1

    4 闭包应用
       (1) 使用闭包能够跟踪动态环境中,数据的实时变化
    function fn1(){
        var a = 1
        var b = function fn2(){
            return a
        }
        a++
        return b
    }
    var c = fn1()()
    alert(c)   // 2

    (2)闭包不会因为外部环境的注销而消失
    ----当 fn1 执行完毕,并没有被销毁,因为闭包引用了变量 a ,所以继续存在
      function fn1 (){
        var a = 1
        b = function(){alert(a)}
        c = function(){alert(a++)}
        e = function(){alert(a)}
        d = function(x){alert(a = x)}
        b()
        c()
        e()
        d(5)
    }
    fn1()

    5 闭包的底层原理
    作用域链:1 当某个函数被调用时,会创建一个执行环境和相应的作用域链,同时初始化函数的活动对象
             2 在作用域链中,该函数处于作用域链第一层,该函数的外部函数作用域处于第二位,外部的外部处于第三层...直到作用域的终点为全局作用域
             3 作用域链的查找是自下到上
    function fn1(){
        if( a<b ){
            return -1
        }else{
            return 1
        }
    }

    function fn1 (arg){
        return function(a,b){
            var v1 = a[arg1]
            
            var v2 = b[arg1]
            if(v1<v2){
                return -1
            }else{
                return 1
            }
        }
    }
    fn2 = fn1("zs")
    fn2 ({"age":23},{"age":24})

    6 闭包重点
    function fn1(){
        var a = []
        for(var i = 0; i<3;i++){
            a[i] = function(){
                return i
            }
            return a
        }
    }
    var b = fn1()
    alert(b)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值