闭包

js闭包

痴心易碎 提交于 2020-02-25 00:37:34
1.闭包的三个条件 (1)函数内嵌套函数,外部函数直接或间接返回内部函数 (2)内部函数可以引用外部函数的参数或变量 (3)形成一个不会被销毁的函数空间,也就是说参数和变量不会垃圾回收机制回收 2.什么是闭包空间 满足了以上三个条件,我们就管外部函数的执行空间叫做闭包空间,把返回的内部函数叫做外部函数的闭包函数 3.闭包的特点 优点: (1)延长了变量的生命周期 (2)可以访问函数内部的私有变量 (3)保护了私有变量 缺点: 因为闭包的执行空间不会被销毁,所以会一直占据内存,可能会造成内存溢出,因此不到万不得已不要使用闭包。 4.作用 当需要延长变量的生命周期的时候,或者需要访问函数的私有变量时使用 闭包代码: //外部函数a function a() { var num = 100 //内部函数b return function b() { console.log(num) } } var res=a();//接受到内部函数b res();//执行函数b,输出num 来源: CSDN 作者: 渴望叮当猫的鱼 链接: https://blog.csdn.net/qq_44454898/article/details/104486657

python基础-装饰器

十年热恋 提交于 2020-02-24 15:50:20
    1、什么是装饰器         装饰指的是为被装饰对象添加新的功能         器指的是工具       装饰器本身可以任意可调用的对象,被装饰的对象也可以是任意可调用的对象     2、为什么要装饰器         扩展新功能:写一个函数用来为另外一个函数添加新功能,需要遵循开放封闭原则(对修改是封闭的,对扩展是开放的)         1、不修改被装饰对象的源代码         2、不修改装饰对象的调用方式     3、怎么用       例如:统计函数的时间                 1.创建新功能(计算时间)的函数              满足了第一个要求,不改变源代码。但调用方式改了       2.创建装饰器,将新函数设计成闭包函数,被调用函数以参数形式传入装饰器              3.变量接受装饰器的返回值                     虽然满足了2个要求,但只适应于 无参的被装饰函数.       若被装饰函数为              按照原来设计,则出错。闭包函数wrapper无参数              所以为闭包函数添加参数*args,**kwargs              最后填好返回值            4.语法糖       装饰器的语法糖:在被装饰对象的正上方单独一行写上@装饰器名字、    

浅浅谈Js闭包

丶灬走出姿态 提交于 2020-02-24 08:04:13
闭包就是能够读取其他函数内部变量的函数。由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。 要了解闭包,首先了解函数,函数分为两个阶段。 函数定义阶段: 在内存中开辟一个存储空间 把函数体内的代码当作字符串一摸一样的放在这个空间中,碰到的所有变量都不进行解析 把这个空间地址赋值给函数名(变量名) 函数调用阶段 按照函数名(变量名)找到对应的存储空间 从新开辟一个函数 执行空间 在这个执行空间里面进行形参赋值 在这个执行空间里面进行预解析 把函数存储空间的代码复制一份到执行空间里面执行一遍 执行完毕之后, 这个开辟出来的执行 空间销毁 注意: 每一次函数调用都会开辟一个执行空间 调用一次,开辟一个执行空间,执行完毕代码销毁。 再次调用的时候,再次开辟一个执行空间,执行完毕代码销毁 闭包: function a(){ //这个num变量就是函数a的私有变量 var num = 100; return function b(){ console.log(num); } } //res接受的就是函数a内部返回的一个复杂数据类型(函数b) var res = a(); //res接受的就是函数b的执行空间的地址,就是函数a执行以后的返回值 res() // 当 res 调用的时候, 打印 num // 打印出来的就是 a

闭包的理解

廉价感情. 提交于 2020-02-24 08:03:15
形成闭包的必须满足三个条件 functin a(){ var num=100; return function b(){ console.log(num) } } //mm 接受的是 a 函数执行以后的返回值 // mm 接受的就是函数 a 内部返回的一个复杂数据类型(函数b) var mm=a() mm() // 打印出来的就是 a 函数内部的私有变量 num 的值 1.在函数 A 内部直接或者间接返回一个函数 B 2. B 函数内部使用着 A 函数的私有变量(私有数据) 3. 3. A 函数外部有一个变量接受着函数 B 闭包的特点(优点和缺点并存) 1. 延长了变量的生命周期 + 优点: 因为执行空间不销毁, 变量也没有销毁 + 缺点: 因为执行空间不销毁, 会一直存在在内存中 2. 可以访问函数内部的私有变量 + 优点: 利用闭包函数可以访问函数内部的私有变量 + 缺点: 执行空间不会销毁, 会一直存在在内存中 3. 保护私有变量(只要是函数, 就有这个特点) + 优点: 保护私有变量不被外界访问 + 缺点: 如果向访问, 必须要利用闭包函数 闭包的函数的缺点 致命 + 因为当一段内存空间中有一个不会被销毁的东西一直存在 + 那么就会出现内存占用, 如果过多, 就会导致内存溢出 + 那么结果就是 内存泄漏 闭包的作用 + 就是当你需要延长变量的声明周期的时候 +

浅谈js闭包

萝らか妹 提交于 2020-02-24 08:02:07
什么是闭包? 在了解闭包之前,让我们来回顾一下什么是变量作用域? 变量根据作用域的不同分为两种:全局变量(在函数外部)和局部变量(在函数内部)。 函数内部可以使用全局变量。 函数外部不可以使用局部变量。 当函数执行完毕,本作用域内的局部变量会销毁。 闭包的含义 闭包(closure)是指有权访问另一个函数作用域中变量的函数,是JavaScript中,函数的一种高级应用。 简单理解就是,一个作用域可以访问另外一个函数内部的局部变量。 生成闭包的三个必要条件(三个条件缺一不可) 在函数A内部直接或者间接返回一个函数B B函数内部使用着A函数的私有变量(私有数据) A函数外部有一个变量接收着函数B 闭包函数会形成一个不会销毁的函数空间 function a ( ) { //num变量就是函数a的私有变量 var num = 100 ; return function ( b ) { console . log ( num ) } } //res 接收的是a函数执行以后的返回值 //res接收的就是函数a内部返回的一个复杂数据类型(函数b) // =>导致函数a的执行空间不会销毁 //res 随时可以是一个函数a里面返回的函数b // =>res可以随时调用 res ( ) //当res调用的时候,打印num,打印出来的就是a函数内部的私有变量num的值

JS闭包

假装没事ソ 提交于 2020-02-24 04:57:44
JS闭包 了解函数的两个阶段 函数的定义阶段 在内存中开辟一个存储空间 把函数体内的代码当作字符串一模一样的放在这个空间中(遇到的所有变量都不进行解析) 把这个空间地址赋值给函数名(变量名) 函数的调用阶段 按照函数名(变量名)找到对应的存储空间 从新开辟一个函数 执行空间 在这个执行空间里面进行形参赋值 在这个执行空间里面进行预解析 把函数存储空间的代码复制一份到执行空间里面执行一遍 执行完毕之后, 这个开辟出来的执行 空间销毁 注意 :函数每次调用的时候都会开辟一个执行空间,调用完毕代码就会被销毁,当你再次调用的时候会再开辟一个执行空间,执行完毕代码就会被销毁。 举个栗子: var num = 100 function fn ( ) { console . log ( '数字: ' + num ) } fn ( ) fn ( ) 函数的两个阶段上图代码的图解: 解析: 函数定义阶段 在内存中开辟了一个函数存储空间(xxff00) 把 console.log('数字: ’ + num) 这句代码放在这个存储空间中, 此时 num 变量没有解析, 存储的就是 num 把 xxff00 这个空间地址赋值给了 fn 这个函数名 函数调用阶段 按照 fn 里面存储的地址, 找到 xxff00 这个函数存储空间 开辟一个函数执行空间(xxff11), 在运行内存里面 在 xxff11

关于闭包

故事扮演 提交于 2020-02-23 21:15:01
闭包是个啥? 闭包实际上就是Javascript中的一种函数的高级应用方式 。 每个函数在执行时,都会堆内开辟一个执行空间,当调用完毕之后,这个函数的执行空间会立即删除。但有的时候,我们想让这个执行空间保留着,就说时延长它的寿命吧,该怎么办呢?当函数内部返回一个 复杂数据类型 时,并且在函数的外部有变量正在接受这个 复杂数据类型 ,这个时候函数的执行空间就不会销毁,这就是闭包存在的意义。 闭包产生的必要条件 三个条件,缺一不可: 在函数 A 内部直接或间接返回一个函数 B; B 函数内部使用着函数 A 的私有变量; 函数 A 外部有一个变量接受着它的返回值,即函数 B; 如图: 变量res接受着函数a的返回值,res()调用了函数 b,打印的结果为10;这样就形成了一个不会自动销毁的a 函数的执行空间,我们称它为 闭包空间 。 函数 a 里面返回的函数 b,是函数 a 的 闭包函数 ; 闭包的特点 1. 延长了变量的生命周期 优点:因为执行空间没有销毁,所以变量也保留了下来,延长了变量的生命周期; 缺点:因为执行空间不销毁,会一直占用着内存,使用次数过多的时候,容易造成内存溢出; 2.可以访问函数内部的私有变量 优点:利用闭包函数可以访问函数内部的私有变量; 缺点:必须要一直保持外部变量的调用,同时会一直存在在内存中; 3.保护私有变量(只要是函数,就有这个特点) 优点

面试必问之闭包

早过忘川 提交于 2020-02-23 20:31:06
/** 1、闭包的概念 闭包可是指有权访问另一函数作用域中的变量的函数,或者简单理解为定义在一个函数内部的函数; **//** 2、闭包的特点 a、函数嵌套函数 b、函数内部可以引用函数外部的参数和变量 b、参数和变量不会被垃圾回收机制回收 **//** 3、闭包的优缺点 优点: ①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突 ②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存) ③匿名自执行函数可以减少内存消耗 缺点: ①被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null; ②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响; **//** 4、闭包有哪些应用场景? ①闭包之定时器参数传递 //原生的setTimeout擦混提的第一个函数不能带有参数 setTimeout(function(a){ alert(a) },1000) //通过闭包可以实现传参效果 function b(a){ return function(){ alert(a); } } var f = b(1); setTimeout(f,1000); ②闭包之setTimeout for(var i = 0; i < 5;

JS闭包原理分析

我怕爱的太早我们不能终老 提交于 2020-02-23 03:29:34
JS闭包原理分析 闭包是指有权访问另一个函数作用域中的变量的函数。在一个函数A内部返回另一个函数B,并且函数B里面使用者A函数内部的私有变量,此外在函数A外面定义一个变量接收函数B,这样就形成了闭包。 比如在一栋房子里面有很多个小房间,你手上通过拿着一个小房间的地址(xxx栋001房),那么通过小房间的地址就可以找到这栋房子,进入里面。 函数都有自己的执行环境,该环境定义了变量或者函数访问数据的权限。JS 在运行的时候,会为每一个执行函数分配内存空间,我们称这个空间为作用域对象(Scope Object)。当调用函数时,函数中分配的本地变量会被存储在这个作用域对象中。当函数执行了之后,该空间会被销毁,该空间内的变量也会被销毁。 函数作用域对象是按顺序访问的,最先能够访问的是当前函数的作用域,如果访问的变量在当前作用域没有,会访问上一层作用域,直到找到全局作用域(Global)对象。如果访问到全局作用域也没有这个对象,会抛出ReferenceError的异常。这就是所谓的作用域链(scope chian)。 闭包之所以能够访问到上一层函数中的局部变量,是因为当变量被捕获之后,即使上一层函数调用完毕出栈了,但是它的作用域对象没有被销毁,所以仍然能够被闭包访问。 在函数内部返回一个函数,并且在外部定义一个全局变量接收这个返回的函数,该变量存储的实际上是返回的函数的存储地址

闭包

こ雲淡風輕ζ 提交于 2020-02-21 09:32:55
闭包的概念 官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 当一个函数能够记住并访问到其所在的词法作用域及作用域链,特别强调是在其定义的作用域外进行的访问,此时该函数和其上层执行上下文共同构成闭包。 需要明确的几点: 闭包一定是函数对象 函数内保持对上层作用域的引用 * 闭包和词法作用域、作用域链、垃圾回收机制等息息相关 当函数在其定义的作用域外进行访问时,才产生闭包 * 闭包是由该函数和其上层执行上下文共同构成 * 闭包的应用 在函数外读取函数内部的变量; 让局部变量的值能够被保存下来; 将模块的公有属性和方法暴露出来。 闭包的缺点: 闭包会使得函数中的变量被保存在内存中,增加内存消耗,不能滥用闭包,否则会造成网页的性能问题,在低版本IE中还可能导致内存泄露。 。。。 来源: CSDN 作者: 气泡啊 链接: https://blog.csdn.net/weixin_44691775/article/details/104417716