闭包

学习第三天(2019-11-16)

这一生的挚爱 提交于 2019-12-04 16:28:31
第六章 面向对象的程序设计 ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”可以把这里的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。 1、对象的属性类型 ECMAScript中有两种属性:数据属性和访问器属性。 a:数据属性 数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。 [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特 性,或者能否把属性修改为访问器属性,默认值为 true。 [[Enumerable]]:表示能否通过 for-in 循环返回属性,默认值为 true。 [[Writable]]:表示能否修改属性的值,默认值为 true。 [[Value]]:包含这个属性的数据值,默认值为 undefined。 要修改属性默认的特性,可以使用 ECMAScript 5的Object.defineProperty()方法。这个方法 接收三个参数:属性所在的对象、属性的名字和一个描述符对象。 b:访问器属性 访问器属性不包含数据值,它们包含一对儿 getter和 setter函数(这两个函数不是必须的)。在读取访问器属性时,会调用 getter函数,这个函数负责返回有效的值; 在写入访问器属性时,会调用 setter函数并传入新值

JavaScript——匿名函数和闭包

妖精的绣舞 提交于 2019-12-04 16:21:42
匿名函数就是没有名字的函数 闭包就是一个函数中的另一个函数 函数可以不加分号,但是语句要加!! 可以把匿名函数的返回值赋值给变量!! box()时返回里面的函数,再加一个()就会返回里面那函数的值(浅显的理解) 使用对象冒充 块级作用域: 变量前不加var便是声明全局变量! 来源: https://www.cnblogs.com/kongbursi-2292702937/p/10714863.html

理解闭包

[亡魂溺海] 提交于 2019-12-04 16:21:08
闭包这个概念好难理解,身边朋友们好多都稀里糊涂的,稀里糊涂的林老冷希望写下这篇文章能够对稀里糊涂的伙伴们有一些帮助~ 请大家跟我理解一下,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。 闭包:   在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。 一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。   很晦涩很难理解啊!!我们来看一段代码^.^ 1 #闭包函数的实例 2 # outer是外部函数 a和b都是外函数的临时变量 3 def outer( a ): 4 b = 10 5 # inner是内函数 6 def inner(): 7 #在内函数中 用到了外函数的临时变量 8 print(a+b) 9 # 外函数的返回值是内函数的引用 10 return inner 11 12 if __name__ == '__main__': 13 # 在这里我们调用外函数传入参数5 14 #此时外函数两个临时变量 a是5 b是10 ,并创建了内函数,然后把内函数的引用返回存给了demo 15

函数柯里化(Currying)小实践

≡放荡痞女 提交于 2019-12-04 15:18:23
什么是函数柯里化 在计算机科学中,柯里化(Currying)是把 接受多个参数的函数变换成接受一个单一参数 (最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。 举个例子,假设程序员A是个妻管严,工资悉数上交给妻子,为了买一个心爱的键盘 程序员A每天都偷偷藏几毛钱,打算年底买个键盘,因此程序员A写了以下这个方法用来统计年终一共凑了多少钱,方法如下: /** * @description 统计金额 * @return {number} */ function countMoney() { let money = 0 // 温馨提示:arguments是所接收的所有参数组成的类数组,不懂的需要搜一搜补补知识啦 for (let i = 0; i < arguments.length; i++) { money += arguments[i] } return money } // 藏了一年的账本记录的数据 const records = [1, 1, 2, 2, 3, 3, 4, 4] // 把全部数据都输入进行计算 countMoney(1, 1, 2, 2, 3, 3,

作用域、闭包、global、nonlocal

痞子三分冷 提交于 2019-12-04 14:22:26
1.作用域基础 python中一切与变量名有关的事件,都发生在赋值时,变量名在第一次赋值时才存在,同时要使用该变量必须先赋值。由于python中没有变量声明(如java、c#中),在变量赋值的区域就决定了该变量的命名空间。 在函数(def声明)中声明的变量,只能在该函数内访问,并且要可以和函数外的变量声明相同,不会互相影响,但可以通过global或nonlocal中访问函数外的变量,但两个关键字的作用域和使用范围有差异。 变量名解析原则:LEGB规则 当在函数中使用未定义的变量名时,会从4个作用域中进行查找,首先是局部作用域(L)、如果有函数嵌套函数关系,那么内在函数会查找外部函数的作用域(E)、全局作用域中查找(G)、最后是内置的作用域,内置作用域指的是python中内部定义的一些关键字,在python3.X中保存在builtins模块中(B)。 2.global global语句告诉python函数计划生成一个或多个全局变量名-----简答来说就是将一个变量定义域全局作用域中,在函数内部可以访问该变量(函数中没有相同变量名),若要修改该变量要先在函数内用global关键字声明。 在全局变量中,即使没用声明一个变量,但在函数中同样可以通过global关键字来指定一个变量为全局变量。 x=99 def f(): x+=1 #会报错,相当于x=x+1,在该函数内没有首先对x赋值

回调函数和闭包

梦想的初衷 提交于 2019-12-04 14:20:39
回调函数和闭包 回调函数,官方解释:当程序跑起来时,应用程序会时常通过API调用库里预先备好的函数。但是有些库函数却要求应用先传给他一个函数,好在合适的时候调用,以完成目标任务。这个被传入、后又被调用的函数被称为回调函数。 简单的说,回调就是回溯,先定义好将要使用的函数体,然后使用时再调用这个函数,通常把callback作为一个参数传入先定义的那个函数。 问:如何从外部读取局部变量。 答:那就是在函数的内部,再定义一个函数。 function f1() { var n = 999; function f2() { alert(n); // 999 } } (父对象的所有变量对子对象都是可见的,反之不成立。) 既然f2可以读取f1中的局部变量,只要把f2作为返回值,就可以从f1外部读取它的内部变量了。f2就是闭包。 闭包的用途 可以读取函数内部的变量 让这些变量的值始终保持在内存中。 function f1() { var n = 999; nAdd = function() {n+=1} function f2() { alert(n) } return f2; } var result = f1(); result(); // 999 nAdd(); result(); //1000 在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值为999

PHP 7.4 新语法:箭头函数

末鹿安然 提交于 2019-12-04 14:05:39
短闭包,也叫做箭头函数,是一种用 php 编写的短函数。当向函数中传递闭包时,这个功能是非常有用的,比如使用 array_map 或是 array_filter 函数时. 译者注:PHP7.4 计划于今年底发布,请见 Wiki:PHP 基础信息:发行计划 这就是它们看起来的样子: 1 // Post 对象的集合 2 $posts = [/* … */]; 3 4 $ids = array_map(fn($post) => $post->id, $posts); 5 而以前,你必须这样写: 6 7 $ids = array_map(function ($post) { 8 return $post->id; 9 }, $posts); 我们来总结一下短闭包函数如何使用. 在 PHP 7.4 里可用 以 fn 关键字开头 只能包含 一个 表达式,即返回表达式 return 关键字可忽略 参数和返回类型均可做类型暗示 上面示例更严格的类型限定写法可写作: $ids = array_map(fn(Post $post): int => $post->id, $posts); 有两点需要提及: 还允许使用扩展操作符 允许引用,两个参数都可以作为返回值 假如你想要通过引用的方式返回结果,应该使用以下语法: fn&($x) => $x 简而言之,除了只允许一个表达式以外

9.4 关系的闭包

独自空忆成欢 提交于 2019-12-04 13:41:05
9.4 关系的闭包 闭包的定义: 关系R对于性质P的闭包,是加入最小数量的序偶,使得R恰好符合性质P所得到的集合 R的闭包R 1 具有如下3个特点: ①. R 1 包含 R ②. R 1 具有性质P ③. 如果R 2 具有性质P且R 2 包含R, 那么R 2 包含R 1 就R的有向图而言: 找其自反闭包(reflexive closure) 添加循环/闭环 找其对称闭包(symmetric closure) 沿相反方向添加弧线(箭头) 找其传递闭包(transitive closure) 如果a到b连通, 那么就添加从a到b的弧线(箭头) 自反闭包(reflexive closure) 定理:R是定义在A上的关系,那么R的自反闭包r(R) = R∪△ 如何获得? ①. 在R的有向图的所有顶点上添加闭环 ②. 令R的邻接矩阵的对角线上全为1 对称闭包(symmetric closure) 定理①:R是定义在A上的关系,那么R的对称闭包s(R) = R∪R -1 NOTE : R -1 = {(b, a) | (a, b) ∈ R} NOTE : R -1 的邻接矩阵是R的邻接矩阵的转置, 即: M R T = M R -1 定理②:R是对称的,当且仅当 R = R -1 NOTE :在对称关系的有向图中,用无向的边来代替弧线(箭头) 路径(Paths) 假设R为定义在A上的关系

闭包函数 装饰器

試著忘記壹切 提交于 2019-12-04 13:33:25
闭包函数 什么是闭包函数: ​ 闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体 闭包函数注意事项: 闭包函数必须在函数内部定义 闭包函数可以引用外层函数的名字 #直接传参 def func(x): print(x) func(1000) 1000 #通过闭函数传参 def outer(number): def inner(): print(number) return inner func = outer(1000) # --->inner地址 ----> func变量名 func() #---> inner地址 装饰器 什么是装饰器 : 在函数中用来给添加新功能的工具 ​ 为什么要用装饰器: 为了提高代码的可读性,防止代码的冗余 怎么用装饰器: 不修改被装饰对象的源代码 不修改被装饰对象的调用方式 被装饰对象: -----> 需要添加功能 函数 装饰器:------> 被装饰对象添加的新功能 的 函数 time_record --- > 装饰器 # 统计下载电影函数的运行时间 import time def download_movie(): print('电影开始下载...') time.sleep(3) print('电影下载完成...') start_time = time.time() download_movie() end_time = time.time(

Swift3.0 闭包(blcok)的全面介绍及使用

时光毁灭记忆、已成空白 提交于 2019-12-04 13:22:05
闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。 闭包表达式语法有如下的一般形式: { (parameters) -> returnType in statements } 这里的参数(parameters),可以是in-out(输入输出参数),但不能设定默认值。如果是可变参数,必须放在最后一位,不然编译器报错。元组也可以作为参数或者返回值。 闭包的函数体部分由关键字in引入。该关键字表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始 例如: let sum:(Int , Int) -> Int = {(a : Int ,b : Int) -> Int in return a + b } print(sum(3,4)) 由于可以推断出闭包的参数和返回值类型,所以闭包表达式可以表达为: let sum:( Int , Int ) -> Int = { a , b in return a + b } 单表达式闭包隐式返回 单行表达式闭包可以通过省略 return 关键字来隐式返回单行表达式的结果,如上版本的例子可以改写为