高级JS作用域和闭包五

var x = 10;
    function fn() {
      console.log(x);
    }
    function show(f) {
      var x = 20
      f()
    }
    show(fn)

    var fn1 = function() {
      console.log(fn1);
    }
    fn1()
    var obj = {
      fn2: function() {
        console.log(this.fn2);
      }
    }
    obj.fn2()

作用域:

  • 块没有作用域(大括号没有作用域);
  • 隔离变量:不同作用域可以声明相同的变量名,不会受到影响;
  • 作用域:的个数(n+1:你表示定义的函数个数),作用域在函数定义的时候就确定了,是静态的,函数定义后就一直存在,不会再变化;
  • 执行上下文:全局:在全局作用域确定之后,js代码马上执行之前创建;函数:在函数调用之前,函数体执行之前;是动态的,调用函数时创建,调用结束后自动释放掉;
  • 联系:上下文环境(对象)属于所在的作用域;
  • 作用域链:嵌套的作用域,从里到外变量;
// 将函数作为一个函数的返回值
    function fn1() {
      var a = 10
      function fn2() {
        a++
        console.log(a);
      }
      return fn2
    }
    var f = fn1()
    console.log(f);
    f()
    f()
    // 将函数作为实参,传递给另一个函数调用
    function showDelay(msg, time) {
      setTimeout(function() {
        console.log(msg);
      }, time)
    }
    showDelay('zhangsan',10)
    // 闭包的缺点
    function fn3() {
      var arr = new Array(100)
      function fn4() {
        console.log(arr.length);
      }
      return fn4
    }
    var fnn = fn3()
    fnn()
    fnn = null
    console.log(fnn);

闭包:

  • 闭包的产生:当一个嵌套的内部函数引用了外部嵌套函数的变量(函数)时,就产生了闭包;执行函数定义就会产生闭包(不用调用内部函数,但是外部函数需要调用);在外部函数定义变量,在内部函数引用变量,才会产生;
  • 闭包是什么:将一个内部函数和外部函数连接起来的桥梁;
  • 闭包作用:使函数内部的变量在函数执行完成后,任然存在内存中(延长局部变量的生命周期);让函数外部可以操作(读写)到函数内部的数据(变量、函数);
  • 闭包的生命周期:产生:在嵌套内部函数定义执行完成就产生;死亡:在嵌套的内部函数没有被调用(指向)称为垃圾对象时;
  • js模块:具有特定功能的js文件、所有的数据和功能都封装在一个函数里面(私有的)、只向外暴露一个包含多个方法的对象或函数、模块的使用者,只需要通过模块暴露的对象调用方法来实现对应功能;
  • 闭包的缺点:函数执行完之后,函数内部局部变量没有释放,占用内存时间变长,容易造成内存泄漏;解决:让内部函数称为垃圾对象,回收闭包;内存溢出(程序运行的一种错误,程序运行需要的内存超过了剩余的内存,就会抛出内存溢出的错误);内存泄漏(占用内存没有及时释放,内存泄漏积累多了很容易导致内存溢出;常见的内存泄漏:1.意外全局变量,如局部没有用var定义,导致变为全局变量;2.启动循环定时器后或回调函数不清理,不用的时候需要清理;);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值