闭包

JS闭包的详解

不想你离开。 提交于 2020-02-09 14:20:27
目录 一、什么是闭包? 二、闭包有什么好处?应用在哪? 2.1 好处: 2.2 用法: 三、闭包需要注意的地方? 3.1 IE下会引发内存泄露 一、什么是闭包? 特点: 1 函数嵌套函数 2 内部函数可以引用外部的参数和变量 3 参数和变量不会被垃圾回收机制所回收 举一个简单的闭包的例子,例子中符合闭包的三个特点 function aaa(a){ var b = 5; function bbb(){ alert(a); alert(b); } } aaa(); 关于js 中的垃圾回收机制,这里说明一下。请看下面代码,当aaa函数执行完毕之后,aaa中的变量a会被js的垃圾回收机制所回收 function aaa(){ var a = 1; } aaa(); // 改函数执行完毕时候,函数中的变量a会被js的垃圾回收机制所回收 再举一个闭包例子 当aaa函数执行完毕之后,调用c函数仍然可以弹出1,说明了a这个变量没有被垃圾回收 function aaa(){ var a = 1; function bbb(){ alert(a); } return bbb; } var c = aaa(); // 当aaa函数执行完毕之后,调用c函数仍然可以弹出1,说明了a这个变量没有被垃圾回收 c(); 二、闭包有什么好处?应用在哪? 2.1 好处: 1 可以使一个变量常驻内存 2

python语法生成器、迭代器、闭包、装饰器总结

三世轮回 提交于 2020-02-09 09:44:40
1、生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, 4, 6, 8] # 生成器 G = ( x*2 for x in range(5)) # 此时的G是,<generator object <genexpr> at 0x7f626c132db0> 创建列表生成式和生成器的区别只是最外层的()和[],列表生成式是一个列表,而生成器事宜个可迭代对象。生成器对象可以通过for语句遍历每个元素。 for each in G: print(each) # 打印结果是 0 2 4 6 8 (2)通过函数来实现 generator非常强大,如果推算的算法比较复杂,用类似的列表生成式的for循环无法实现的时候,可以通过函数来实现。 以著名的斐波拉契数列(Fibonacci), 除第一个和第二个数外,任意一个数都可以由前两个数相加得到:1,1,2,3,5,8,13…. 斐波拉契数列用列表生成式不容易写出来,但是用函数把它打印出来很容易: def fib(times): n = 0 a, b = 0, 1 while n < times: yield b # 这里用的yield将b的值返回到生成器中。 a, b = b, a+b n += 1

016.Python闭包函数以及locals和globals

我们两清 提交于 2020-02-09 09:27:29
一 闭包函数 内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,这个内函数叫做闭包函数 1.1 闭包函数语法 def outer(): a = 5 def inner(): print(a) return inner 对比正常的局部变量 局部变量的生命周期最短,在调用结束之后,立即释放. def func(): a = 5 print(a) func() print(a) 执行 1.2 闭包函数的定义 def bibao(): people = "孙仲谋" def caocao_say(): print("生子当如%s" % (people)) return caocao_say func = bibao() # func = caocao_say func() 执行 [root@node10 python]# python3 test.py 生子当如孙仲谋 1.3 闭包函数的特点(升级) 内函数使用了外函数的局部变量,外函数的局部变量与内函数发生绑定,延长该变量的生命周期(实际内存给它存储了这个值,暂时不释放) 示例 def grade(str1): def func_in(str2): print(str1+str2) return func_in a=grade('小李:') a('语文:118') b=grade('小红:') b('语文:109')

js 函数讲解

这一生的挚爱 提交于 2020-02-09 07:15:32
函数 来自 《JavaScript 标准参考教程(alpha)》 ,by 阮一峰 目录 概述 函数的声明 函数的重复声明 圆括号运算符,return 语句和递归 第一等公民 函数名的提升 不能在条件语句中声明函数 函数的属性和方法 name 属性 length 属性 toString() 函数作用域 定义 函数内部的变量提升 函数本身的作用域 参数 概述 参数的省略 传递方式 同名参数 arguments 对象 函数的其他知识点 闭包 立即调用的函数表达式(IIFE) eval 命令 参考链接 函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 概述 函数的声明 JavaScript 有三种声明函数的方法。 (1)function 命令 function 命令声明的代码区块,就是一个函数。 function 命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数。函数体放在大括号里面。 function print(s) { console.log(s); } 上面的代码命名了一个 print 函数,以后使用 print() 这种形式,就可以调用相应的代码。这叫做函数的声明(Function Declaration)。 (2)函数表达式 除了用 function 命令声明函数,还可以采用变量赋值的写法。 var print =

函数式编程语言

佐手、 提交于 2020-02-09 05:26:30
函数式思想 什么是函数式编程? 百科定义: 函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 个人理解就是我们的编程是以函数作为单元来处理各个业务逻辑,函数既可以当做参数传来传去,也可以作为返回值,可以把函数理解一个值到另一个值得映射关系。 优势特点 代码简洁、开发快速 函数式代码同命令式相比代码量要少很多,一行顶十行,所以实现一些功能也比较简洁。 功能描述:统计文本或网页中单词的频率TF(term frequency),词频在计算网页质量、信息检索中是一个重要概念。 函数式编程思维是对集合统一处理、统一操作,而命令式编程需要取出来每个单词单独处理,单独计数,而函数式只需要传入待处理对象集合、处理规则,我们不需要关注于具体细节,这样编程不仅仅减少了出现bug的概率而且提高了IT人员开发效率,何乐而不为呢。 易于理解,抽象度高 让我们再来看一个在开发中,我们经常遇到场景,例如我们有一个List列表,我们要把user的某个属性提取出来生成一个新的List。 假设你已经了解了函数式语言的语法,你可能会觉得函数式写法很简洁,函数式编程并不需要你关注细节实现,我们在获取用户名作为一个新List时并没有对单独user对象操作,而是是告诉集合对象,我们要做什么

关键字global和nonlocal的用法

大兔子大兔子 提交于 2020-02-08 20:52:52
1.首先,要明确 nonlocal 关键字是定义在闭包里面的(不定义在闭包里会抛异常SyntaxError: nonlocal declaration not allowed at module level) 在闭包里面加入nonlocal关键字进行声明。当使用 nonlocal 时,就声明了该变量不只在嵌套函数inner()里面才有效, 而是在整个大函数里面都有效 2.global 是对整个环境下的变量起作用,而不是对函数内的变量起作用。 总结:nonlocal与global的区别 nonlocal:如果在闭包内给该变量赋值,那么修改的其实是闭包外那个作用域中的变量。 global:用来表示对该变量的赋值操作,将会直接修改模块作用域里的那个变量。(nonlocal与global互为补充) 来源: https://www.cnblogs.com/GumpYan/p/12284766.html

《go语言从入门到进阶实战》_徐波

痞子三分冷 提交于 2020-02-08 02:02:57
摘录 Go语言是Google公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。 Go语言不使用虚拟机,只有运行时(runtime)提供垃圾回收和goroutine调度等。 Go语言使用自己的链接器,不依赖任何系统提供的编译器、链接器。因此编译出的可执行文件可以直接运行在几乎所有的操作系统和环境中。 从Go 1.5版本之后,Go语言实现自举,实现了使用Go语言编写Go语言编译器及所有工具链的功能。 Go语言可以利用自己的特性实现并发编译,并发编译的最小元素是包。从Go 1.9版本开始,最小并发编译元素缩小到函数,整体编译速度提高了20%。 Go语言的并发是基于goroutine,goroutine类似于线程,但并非线程。可以将goroutine理解为一种虚拟线程。Go语言运行时会参与调度goroutine,并将goroutine合理地分配到每个CPU中,最大限度地使用CPU性能。 在Go语言中,自增操作符不再是一个操作符,而是一个语句。因此,在Go语言中自增只有一种写法: i++ 如果写成前置自增“++i”,或者赋值后自增“a=i++”都将导致编译错误。 在多个短变量声明和赋值中,至少有一个新声明的变量出现在左值中,即便其他变量名可能是重复声明的,编译器也不会报错。 布尔型无法参与数值运算,也无法与其他类型进行转换。 切片发生越界时,运行时会报出宕机,并打出堆栈

Python 闭包和__call__详解及开发实践

。_饼干妹妹 提交于 2020-02-07 23:31:57
背景 最近在使用 wtform 做后台的表单验证时候,跟很多框架使用的方法一样,它是结合ORM的对象提供校验, wtform 默认提供了不少的校验器,但是有的字段需要自己编写一些业务相关的校验器。 自定义的每个校验器的特点都是接受两个参数,form, field。 所以我们自己自定义校验器,校验器都必须是可调用对象即可,即函数,对象方法,都可以的。 比如function url_validate(form, field) 我们可以使用下面几种方式来实现 使用函数定制 def my_length_check ( form , field ) : if len ( field . data ) > 50 : raise ValidationError ( 'Field must be less than 50 characters' ) class MyForm ( Form ) : name = StringField ( 'Name' , [ InputRequired ( ) , my_length_check ] ) 上面提供一个my_length_check()函数,用于验证name长达是否长于50个字符。 这个函数按照规定接受两个参数,form, field,然后就可以根据两个参数进行判断。 这样做是可以的,但是问题是: 如果我想自定义错误信息怎么办?而且里面的限制是50,

闭包

青春壹個敷衍的年華 提交于 2020-02-06 23:56:48
形成闭包的条件1.外部函数内定义了内部函数2.外部函数有返回值3.返回的是函数名4.内部函数引用了外部函数的变量格式:def 外部函数(): ... def 内部函数(): ... return 内部函数 def func(): a = 100 def inner_func(): b = 99 print(a, b) return inner_func x = func() x() 闭包传参 1 def func(a, b): 2 c = 10 3 4 def inner_func(): 5 s = a+b+c 6 print("相加后的结果:", s) 7 8 return inner_func 9 10 11 # 调用func 12 ifunc = func(1, 2) # ifunc = inner_func 13 14 # 调用ifunc 15 ifunc() 来源: https://www.cnblogs.com/GumpYan/p/12271478.html

gradle 初体验

拟墨画扇 提交于 2020-02-06 18:09:31
1,gradle 认识。 gradle 和 maven ,ant类似,是一个构建工具,底层依赖groovy脚本语言,groovy 也是一个完全可以兼容运行在JVM上的一个脚本语言,类似的scala 也是运行在JVM,而maven 是java 编写的,构建配置是XML, gradle 是脚本语言来构建配置,好处不言而喻,同时ant 迁移gradle 也很方便。是android studio 的默认内置构建工具。 维基百科定义 1,gradle 下载 https://gradle.org/releases/ 解压,配置环境变量 2,idea 新建gradle 工程 idea 自己内置了gradle 的版本,可以进去配置为自己指定的版本 1>新建一个gradle 项目 打开groovy 编辑器,一个命令行终端,开始学习groovy 的基本用法,为编写gradle 构建脚本打下基础。 概念入门, https://www.w3cschool.cn/groovy/ groovy 是一个运行在java 虚拟机上成熟的,面向对象,的弱类型,脚本语言,构建在Java语言之上,添加了python,的流行语言的很多特性,闭包,元编程,动态类型转换等等。 groovy 和Java 类似,但作为脚本语言,语法简化很多 例如定义一个类, 1,不需要public, 2,不需要类型说明 3,不需要setter