闭包

ES6(4)闭包

ぃ、小莉子 提交于 2020-01-22 20:07:46
闭包(有局部变量才会产生闭包) 指有权访问另一个函数作用域中变量的函数(一个作用域可以访问另外一个函数内部的局部变量) 函数返回的是函数就是高阶函数 // fn外面的作用域访问fn内部的局部变量 function fn() { let num = 10; return function() { console.log(num); }; } let f = fn(); console.log(f.prototype.constructor); // f是指向了fun构造函数,所以可以访问fn里面的变量 // 打印结果 // () { // console.log(num); // } f(); 闭包作用:延伸了变量的作用范围 闭包应用 <button>1</button> <button>2</button> <button>3</button> <button>4</button> let btns = document.querySelectorAll("button"); for (let i = 0; i < btns.length; i++) { // (i => { // btns[i].onclick = function() { // console.log(i); // }; // })(i); (i => { setTimeout(() => { console

floyd——排序(传递闭包)

北城余情 提交于 2020-01-22 13:23:59
排序 给定 n 个变量和 m 个不等式。其中 n 小于等于26,变量分别用前 n 的大写英文字母表示。 不等式之间具有传递性,即若 A>B 且 B>C ,则 A>C。 请从前往后遍历每对关系,每次遍历时判断: 如果能够确定全部关系且无矛盾,则结束循环,输出确定的次序; 如果发生矛盾,则结束循环,输出有矛盾; 如果循环结束时没有发生上述两种情况,则输出无定解。 输入格式 输入包含多组测试数据。 每组测试数据,第一行包含两个整数n和m。 接下来m行,每行包含一个不等式,不等式全部为小于关系。 当输入一行0 0时,表示输入终止。 输出格式 每组数据输出一个占一行的结果。 结果可能为下列三种之一: 如果可以确定两两之间的关系,则输出 “Sorted sequence determined after t relations: yyy…y.”,其中’t’指迭代次数,'yyy…y’是指升序排列的所有变量。 如果有矛盾,则输出: “Inconsistency found after t relations.”,其中’t’指迭代次数。 如果没有矛盾,且不能确定两两之间的关系,则输出 “Sorted sequence cannot be determined.”。 数据范围 2≤n≤26,变量只可能为大写字母A~Z。 输入样例1: 4 6 A<B A<C B<C C<D B<D A<B 3 2 A

编译原理(词法分析)

…衆ロ難τιáo~ 提交于 2020-01-22 09:05:09
文章目录 1.编译原理概述 2.词法分析 正规集 正规式 正规文法 自动机 已知集合求正规式、DFA; 已知正规式求DFA、集合; 已知DFA求正规式、集合; DFA的确定化、最小化。 1.编译原理概述 程序设计语言的翻译模式:编译、汇编;转换(预处理);反汇编、反编译;交叉编译、交叉汇编 静态语义错误(如分母不为0)在语义分析阶段可以被检测出来 词法分析里的坑点,因为词法分析只是识别记号,它并不会排查声明变量结构性错误,这个错误要到语法分析之中才可以被检查出来 动态语义错误编译过程中一般不会处理,只有到程序执行时才会发现 几个错误的典型实例 对程序语句的翻译主要考虑两类语句:声明语句和可执行语句,其中,对声明语句,主要是将所需要的信息正确地填入合理组织的 符号表 中;对可执行语句,则是 翻译成中间代码 在以阶段划分的编译器中, 符号表管理 和 出错处理 两个阶段的工作贯穿于编译器工作始终。 有两个因素使得有限自动机是不确定的,一个是 具有ε状态转移 ,另一个是对同一字符, 可能有多于一个的下一状态转移 词法分析器有四个作用,请给出其中的任意两个: 识别记号并交给语法分析器 / 滤掉源程序中的无用成分 / 处理与具体平台有关的输入 / 调用符号表管理器或出错管理器 语法分析器根据语法规则 识别出记号流中的结构 ,并 构造一棵能够正确反映该结构的语法树 。 检查输入中的错误

python基础三大器之装饰器

喜夏-厌秋 提交于 2020-01-22 06:02:21
闭包 由于闭包这个概念比较难以理解,尤其是初学者来说,相对难以掌握,所以我们通过示例去理解学习闭包。 给大家提个需求,然后用函数去实现:完成一个计算不断增加的系列值的平均值的需求。 例如:整个历史中的某个商品的平均收盘价。什么叫平局收盘价呢?就是从这个商品一出现开始,每天记录当天价格,然后计算他的平均值:平均值要考虑直至目前为止所有的价格。 比如大众推出了一款新车:小白轿车。 第一天价格为:100000元,平均收盘价:100000元 第二天价格为:110000元,平均收盘价:(100000 + 110000)/2 元 第三天价格为:120000元,平均收盘价:(100000 + 110000 + 120000)/3 元 ........ series = [] def make_averager(new_value): series.append(new_value) total = sum(series) return total / len(series) print(make_averager(100000)) print(make_averager(110000)) print(make_averager(120000)) 从上面的例子可以看出,基本上完成了我们的要求,但是这个代码相对来说是不安全的,因为你的这个series列表是一个全局变量,只要是全局作用域的任何地方

JavaScript 闭包浅析

浪尽此生 提交于 2020-01-21 15:24:51
词法作用域 闭包 概念 作用 用法 待续 词法作用域 词法作用域是指一个变量在源码中声明的位置作为它的作用域。 同时嵌套的函数可以访问到其外层作用域中声明的变量。 函数中的定义的局部变量只能由函数的内部成员访问,而函数中的內部成员可以访问外部元素。 例: function main() { // a 是 main 函数创建的局部变量 var a = 'aaa'; // b() 是函数内部方法,一个闭包 function b() { alert(a); // 它使用了父函数声明的变量 } b(); } main(); main() 函数创建了本地变量 a 和函数 b() 。 b() 是定义在 main() 内部的内部函数,因此只能在 main() 函数内被访问。 b() 没有内部变量,但是由于内部函数可以访问外部函数的变量, b() 可以访问 main() 中的变量 a 。 运行上述代码,我们可以看到 a 的值成功地打印出来。 闭包 概念 比较官方的解释: 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。 第一次看见这个就是一脸懵逼,理解过后可以用一个例子解释一下。 小明穿越了,去到了一个异世界,学习了一些个魔法,然后拯救了异世界,最后回到了地球世界。 异世界的故事虽然结束了,但是小明还会魔法,回到地球后就nb坏了

两周自制脚本语言-第7天 添加函数功能

[亡魂溺海] 提交于 2020-01-19 23:30:39
第7天 添加函数功能 基本的函数定义与调用执行、引入闭包使Stone语言可以将变量赋值为函数,或将函数作为参数传递给其他函数 有些函数将有返回值的归为函数,没有返回值的归为子程序 7.1 扩充语法规则 函数定义语句的语法规则 此书将函数定义语句称为def语句。def语句仅能用于最外层代码,用户无法在代码块中定义函数 Stone语言将最后执行语句(表达式)的计算结果将作为函数的返回值返回 代码清单 7.1 与函数相关的语法规则 param : IDENTIFIER params : param { "," param } param_list : "(" [ params ] ")" def : "def" IDENTIFIER param_list block args : expr { "," expr } postfix : "(" [ args ] ")" primary : ( "(" expr ")" | NUMBER | IDENTIFIER | STRING ) { postfix } simple : expr [ args ] program : [ def | statement ] (";" | EOL) 形参param是一种标识符(变量名)。形参序列params至少包含一个param,各个参数之间通过逗号分隔。 param

闭包的作用

折月煮酒 提交于 2020-01-19 22:45:23
1.保护:保护私有变量不受外界干扰 2.保存:形成不销毁的栈内存,把一些值保存下来,方便后续调取使用 来源: 51CTO 作者: 喝醉的熊 链接: https://blog.51cto.com/13550695/2467897

Python函数进阶:闭包、装饰器、生成器、协程

南楼画角 提交于 2020-01-19 13:21:34
/*--> */ /*--> */ 返回目录 本篇索引 (1) 闭包 (2) 装饰器 (3) 生成器 (4) 协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++、Java、JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现。 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包。” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量。 闭包的优点是:实现起来比类稍微轻巧一点(意思就是可以少敲一些代码),并且运行速度比类要快得多(据说约快50%)。下面是一个定义闭包的简单例子: def foo(x, y): def hellofun(): print('hellofun x is %d, y is %d.' %(x,y)) return hellofun a = foo(1,2) b = foo(30,40) a() b() # 运行结果为: hellofun x is 1, y is 2. hellofun x is 30, y is 40. 上例中,foo就定义了一个闭包,它将内部定义的函数hellofun返回(但并不运行这个函数), 同时将入参x,y作为以后hellofun要运行时的环境

函数执行时的作用域链和活动对象是怎么形成的及与闭包的关系

ⅰ亾dé卋堺 提交于 2020-01-19 05:58:59
函数执行时的作用域链和活动对象是如何形成的及与闭包的关系 1、javascript解析器启动时就会初始化建立一个全局对象global object,这个全局对象就 拥有了一些预定义的全局变量和全局方法,如Infinity, parseInt, Math,所有程序中定义的全局变量都是这个全局对象的属性。在客户端javascript中,Window就是这个javascript的全局对象。 2、当javascript执行一个function时,会生成一个对象,称之为call object,function中的局部变量和function的参数都成为这个call object的属性,以免覆写同名的全局变量。 3、javascript解析器每次执行function时,都会为此function创建一个execution context执行环境,在此function执行环境中最重要的一点就是function的作用域链scope chain,这是一个对象链,由全局对象和活动对象构成,对象链具体构成过程见下面说明。 4、标识的查找机制:当javascript查询变量x的值时,就会检查此作用域链中第一个对象,可能是function的call object或全局对象(比如window),如果对象中有定义此x属性,则返回值,不然检查作用域链中的下一个对象是否定义x属性,在作用域链中没有找到

JavaScript闭包

送分小仙女□ 提交于 2020-01-18 17:33:01
在大多数人眼里,闭包是难于理解的,晦涩难懂的,其实只要我们写过js,不管你懂不懂,闭包的身影早已出现在你的代码中了 通俗的说就是,声明在一个函数中的函数 function closure ( ) { var a = 1 ; function inner ( ) { console . log ( a ) ; } return inner ; } var func = closure ( ) func ( ) // a = 2 a变量和inner函数就构成了一个闭包, fuc访问了closure的内部词法作用域 闭包其实是JS函数作用域的副产品 在ES6之前,没有块级作用域,只有全局作用域和局部作用域(函数作用域), 内部的作用域可以访问到外部作用域中的变量和方法,而外部作用域不能访问内部作用域的变量和方法, 当前作用域没有此变量或方法,会向外部作用域寻找变量或方法 无论通过什么手段将内部函数传递到所在的词法作用域之外,它都会保持对定义时作用域的引用,这个函数无论在何处执行,都产生了闭包 function updateTime ( msg ) { setTimeout ( function timer ( ) { console . log ( msg ) } , 1000 ) } 将函数timer传递给setTimeout ( ) , 内部函数timer