闭包

闭包

跟風遠走 提交于 2020-01-27 03:38:57
闭包的本质 : 它就是个函数 概念: 能够访问其他函数内部变量的 函数 条件: 1. 在函数中嵌套定义另外一个函数 2. 被嵌套的函数(在里面的那个),一定要访问外部函数的变量 3, 被嵌套的函数要返回 实现的原理: 通过作用域链 作用 : 能持久化 局部变量, 手动 控制局部变量的回收时间 闭包的弊端 : 不能够大批量的使用,会造成程序加载过慢. 极容易造成内存泄露 function big ( ) { var c = 10 ; // 返回的方式1: return function small ( ) { console . log ( c ) ; } //返回的方式2: return function ( ) { console . log ( c ) ; } //返回的方式3: function small ( ) { console . log ( c ) ; } return small ; // 函数带着(), 是执行。 不带(), 只是定义 } var test = big ( ) ; test ( ) ; 来源: CSDN 作者: weixin_46174967 链接: https://blog.csdn.net/weixin_46174967/article/details/104028368

python基础2——闭包函数

时光总嘲笑我的痴心妄想 提交于 2020-01-26 23:23:20
一、闭包的概念 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量。 简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。 二、闭包函数的必要条件: 1、闭包函数必须返回一个函数对象 2、闭包函数返回的那个函数必须引用外部变量(一般不能是全局变量),而返回的那个函数内部不一定要return 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。 但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。 def line_conf ( a , b ) : def line ( x ) : return a * x + b return line line1 = line_conf ( 1 , 1 ) line2 = line_conf ( 4 , 5 ) print ( line1 ( 5 ) ) print ( line2 ( 5 ) ) 这个例子中,函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b

JS笔记 ( 六 ) 闭包

北慕城南 提交于 2020-01-26 15:04:47
闭包 形成原因 只要内部函数保存到外部, 就会生成闭包 优点 & 缺点 优点 闭包可以让功能模块化, 让缓存可以进行, 可以做存储结构 可以实现封装, 以及属性的私有化 缺点 会导致作用域链不可释放, 造成内存泄漏 闭包示例 代码示例: 这个可以作为一个计数器来使用 function a ( ) { var num = 0 ; function b ( ) { num ++ ; console . log ( 'num: ' + num ) ; } return b ; //将函数返回到外部, 形成闭包 } var test = a ( ) ; //用来接收函数 执行效果: 作用 外部变量会接收生成闭包的函数的函数体以及闭包生成函数内的所有局部变量 如上面的例子, 显然执行完函数 a() 后, 函数会被销毁, 同时其局部变量表 AO 也会被一同销毁, 显然 AO 并没有被销毁, 而是被闭包一起带了出来. 若想一次返回多个函数, 可以在对象里面进行封装. 每次调用闭包中的函数时, 它的局部变量即函数体的 AO 都会被刷新 可以用立即执行函数来使变量值在循环中有效存入数组中 但凡生成索引的时候, 要注意有无闭包生成 来源: CSDN 作者: leon9dragon 链接: https://blog.csdn.net/leon9dragon/article/details

作用域和闭包

孤街浪徒 提交于 2020-01-25 21:39:09
1.作用域 作用域其实就代表了变量合法的使用范围。 作用域分为全局作用域、函数作用域和块级作用域。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 var n=999; function f1(){   alert(n); } f1(); // 999 但是,在函数外部自然无法读取函数内的局部变量。 function f1(){   var n=999; } alert(n); // error 这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量! function f1(){   n=999; } f1(); alert(n); // 999 2.作用域链 一个变量在当前作用域没有被定义,但被使用了,会向上级作用域,一层层寻找,直至找到为止。 这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。 所有自由变量的查找,是在函数定义的地方,向上级作用域查找,而不是在执行的地方!!!!!! function f1(){    var n=999;    function f2(){      alert(n); // n在这个作用域内就是自由变量,999   } } 3.闭包 闭包就是能够读取其他函数内部变量的函数。

Objective-C中的Block(闭包)

纵饮孤独 提交于 2020-01-25 10:41:18
转自http://www.cnblogs.com/ludashi/p/3903054.html?utm_source=tuicool&utm_medium=referral 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西。学过Javascript的小伙伴对闭包应该不陌生吧~学过PHP的应该也不陌生,在PHP5.3版本以后也支持闭包, 也就是OC中所提到的Block。 到底什么是闭包或者block呢?用大白话说就是匿名函数,也就是在函数中可以包含这函数。就是在函数中可以定义匿名函数然后在函数中调用。学习OC中的block之前也小担心一下,Block在OC中属于高级的部分,心里有又有个疑问:学起来难不难?看过Block的部分,感觉Block挺好理解的,用起来也挺顺手的,Block没我想象中的那么难理解。 废话少说,学习一门新的编程语言是少不了代码量的支持的,所以代码是少不了的。下面就通代码来认识一下OC中的block的使用。 Block基础部分 1.Block的声明 Block的定义和函数的声明差不多,就是把函数名改成(^blockName)即可。下面是block声明的代码。 有返回值的 1 int (^sumBlock) ( int , int ); 无返回值的 1 void (^myBlock)( int , int ); 2

闭包和装饰器

筅森魡賤 提交于 2020-01-25 05:00:50
闭包和装饰器 一,闭包 内部的函数引用了外部函数的变量 def f1(b): def f2(): print(b)  #内部函数引用了外部函数的变量b f2() f1() 我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么我们想在函数外部调用函数内部的函数 直接就把这个函数的名字返回就好了。 def func(): name = 'QQQ' def inner(): print(name)  #QQQ return inner f = func() f() 判断闭包函数的方法__closure__ 判断是否为闭包函数 闭包的嵌套 def wrapper(): money = 1000 def func(): name = 'alex' def inner(): print(name,money)  #alex 1000 return inner return func f = wrapper() i = f() i() 内部函数返回一个值到全局 def f1(): #从内部函数返回一个值到全局 b = 10 def f2(): return b return f2() print(f1())  #10 闭包函数获取网络应用 from urllib.request import urlopen def get(url): return urlopen(url)

Go语言学习-函数

*爱你&永不变心* 提交于 2020-01-24 16:12:57
函数 Go不是一门纯函数式的编程语言,但是函数在Go中是“第一公民”,表现在: 函数是一种类型,函数类型变量可以像其他类型变量一样使用,可以作为其他函数的参数或返回值,也可以直接调用执行。 函数支持多值返回。 支持闭包。 函数支持可变参数。 Go是通过编译成本地代码且基于“堆栈”式执行的,Go的错误处理和函数也有千丝万缕的联系。 函数定义 函数是Go程序源代码的基本构造单位,一个函数的定义包括如下几个部分: 1.函数声明关键字func 2.函数名 3.参数列表 4.返回列表 5.函数体。 函数名遵循标识符的命名规则,首字母的大小写决定该函数在其他包的可见性:大写时其他包可见,小写时只有相同的包可以访问; 函数的参数和返回值需要使用“()”包裹,如果只有一个返回值,而且使用的是非命名的参数,则返回参数的“()”可以省略。 函数体使用“{}”包裹,并且“{”必须位于函数返回值同行的行尾。 func funcName(param-list) (result-list) { function-body } 函数的特点 函数可以没有输入参数,也可以没有返回值(默认返回0)。 func A() { //do something //... } func A() int { //do something //... return 1 ) 多个相邻的相同类型的参数可以使用简写模式。 func

day12 python学习 装饰器

﹥>﹥吖頭↗ 提交于 2020-01-24 07:25:15
闭包函数: 内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数 #函数内部定义的函数称为内部函数 闭包函数获取网络应用 from urllib.request import urlopen def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read() return get xiaohua = index() #层层调用层层返回的一个函数# content = xiaohua() #每一层得到的返回值都是下一层的函数,执行返回值 #就是执行下一层函数。 print(content) 判断闭包函数的公式print(inner.__closure__) 输出的__closure__有cell元素 :是闭包函数 def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) return inner 函数名的本质:   就是一个变量,保存了函数所在的内存地址 2.装饰器 装饰器的本质:一个闭包函数   装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展 ##完美的装饰器 def warpper(func): #warpper 是装饰器的名字

函数嵌套,关键字,闭包和装饰器

我的未来我决定 提交于 2020-01-24 07:24:35
函数嵌套 概念:在一个函数的内部定义另一个函数 为什么要有函数的嵌套定义: 1)函数fn2想直接使用fn1函数的局部变量,可以将fn2直接定义到fn1的内部,这样fn2就可以直接访问fn1的变量 2)函数fn2名字就变成fn1的局部变量了,正常只能在fn1中使用,想在外部使用,可以将fn2函数对象作为fn1函数的返回值 3)在外部也用同名的变量fn2来接收fn1函数的执行结果(fn1函数的返回值),那么fn2也可以在外部被调用 """ def fn1(): num = 10 return num num = fn1() def fn2(): print(num) # 本质访问的函数全局变量 fn2() """ """ def fn1(): num = 10 fn2(num) # fn2可以看到fn1的局部变量,但fn2的调用位置不在全局了 print('fn1 end') def fn2(num): print(num) fn1() """ """ def fn1(): num = 10 def fn2(): print(num) fn2() fn1() """ global关键字 作用:将局部的变量提升为全局变量 1.全局没有同名变量,直接提升局部变量为全局变量 2.有同名全局变量,就是统一全局与局部的同名变量 -- 如果局部想改变全局变量的值(发生地址的变化)

python中函数嵌套、函数作为变量以及闭包的原理

 ̄綄美尐妖づ 提交于 2020-01-24 07:09:03
嵌套函数: python允许创建嵌套函数。也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变。 例子: #encoding=utf-8 def outer(): name="python" def inner():#outer函数内部定义的函数 print name return inner()#返回该内部函数 outer() 结果: 理解: 在inner函数中,python解析器需要找一个叫name的本地变量,查找失败后会继续在上层的作用域里面寻找,这个上层作用域定义在outer函数里,python函数可以访问封闭作用域。 对于outer函数中最后一句,返回inner函数调用的结果,需要知道非常重要一点就是,inner也仅仅是一个遵循python变量解析规则的变量名,python解释器会优先在outer的作用域里面对变量名inner查找匹配的变量。 把恰好是函数标识符的变量inner作为返回值返回回来,每次函数outer被调用的时候,函数inner都会被重新定义,如果它不被当做变量返回的话,每次执行过后它将不复存在。 在python里,函数就是对象,它也只是一些普通的值而已。也就是说你可以把函数像参数一样传递给其他的函数或者说从函数了里面返回函数 return内层函数时不加括号,只返回函数的地址: 代码: #encoding=utf-8 def outer