zoukankan      html  css  js  c++  java
  • JS 中的闭包理解

    闭包

    如何产生闭包?

    当一个嵌套的内部(子)函数引用了嵌套外部(父)函数的变量(函数)时,就产生了闭包

    注意: 闭包存在于嵌套的内部函数中

    产生闭包的条件?

    1. 函数嵌套
    2. 内部函数引用了外部函数的数据(变量或者函数)

    作用:

    1. 使函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
      • 函数的生命周期:当函数执行完后,自动释放内部的变量
    2. 让函数外部可以操作函数内部的数据(变量、函数)
    //延长了生命周期和操作局部函数的内部变量
    function fn1() {
    	var a = 1
      	function fn2() {
            a++
            console.log(a)
         }
         return fn2
    }
    var f = fn1()
    f()  //2
    f()  //3
    

    缺点:

    1. 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长 (解决: f = null)
    2. 容易造成内存泄漏

    内存溢出和内存泄漏

    内存溢出:

    • 一种程序运行出现的错误
    • 当程序运行需要的内存超过剩余的内存时,就会抛出内存溢出的错误

    内存泄漏:

    • 占用的内存没有及时释放
    • 内存泄漏积累过多,就会造成内存溢出
    • 常见的内存泄漏:
      1. 意外的全局变量
      2. 没有及时请理的及时器或者回调函数
      3. 闭包

    代码理解

    var name = 'The window'
        var obj = {
          name: 'The object',
          getName: function() {
            return function(){
              return this.name
            }
          }
        }
        console.log(obj.getName()());  //The window
    /*
    分析: 
    	obj.getName():  function() { return this.name}    使 a = obj.getName()
    	a(): this.name   这里就是全局调用,this指向window
    	并且这里可以看出没有使用闭包
    */
    
        var name = 'The window'
        var obj = {
          name: 'The object',
          getName: function() {
            var that = this
            return function(){
              return that.name
            }
          }
        }
        console.log(obj.getName()());  //The Object
    /*
    分析: 
    	obj.getName():  function() { return that.name}    使 a = obj.getName()
    	a(): that.name   这里就是全局调用,that指向obj中的this
    	使用闭包
    */
    
  • 相关阅读:
    Day9
    详解大端模式和小端模式
    gcc常用命令
    Vim自动补全插件----YouCompleteMe安装与配置
    Linux gdb调试器用法全面解析
    JavaSE——javac、javap、jad
    intellij IDEA 常用快捷键
    生成heap dump
    JVM——九大工具助你玩转Java性能优化
    JVM——参数设置、分析
  • 原文地址:https://www.cnblogs.com/xyf724/p/13353927.html
Copyright © 2011-2022 走看看