闭包

PHP闭包Closure研究

两盒软妹~` 提交于 2019-11-30 00:59:02
一、闭包概念 接触过JavaScript朋友可能对闭包有所熟悉,因为JS中我们会经常用到闭包函数,非常方便,呐,PHP5.3也开始引入了闭包的特性。要了解闭包,我们先要知道何为匿名函数,也叫闭包函数(closures),PHP的闭包实现主要是由其完成的。 先看一个函数: $func = function(){ }; // 注意:这里带结束符 可以看到,匿名函数没有名字,如果要使用它,需要将其返回给一个变量,匿名函数像其他普通函数一样,也可以传递参数。 // 带参数的匿名函数 $func = function( $param ) { echo $param; }; $func( 'some string' ); 二、闭包的应用 <?php header("Content-Type:text/html;charset=utf-8"); class Di{ private $_factory; public function set($id,$value){ $this->_factory[$id] = $value; } public function get($id){ $value = $this->_factory[$id]; return $value(); } } class User{ private $_username; function __construct(

PHP闭包(Closure)初探

坚强是说给别人听的谎言 提交于 2019-11-30 00:58:48
不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后。在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣。 于是乎在网上下了个WAMP集成开发环境,是PHP5.3版本的(PHP5.3开始引入了闭包的特性),不得不说WAMP安装使用真的很方便。简单配置了一下,开始动手。 匿名函数 提到闭包就不得不想起匿名函数,也叫闭包函数(closures),貌似PHP闭包实现主要就是靠它。声明一个匿名函数是这样: $func = function() { }; //带结束符 可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同: $func = function( $param ) { echo $param; }; $func( 'some string' ); //输出: //some string 顺便提一下,PHP在引入闭包之前,也有一个可以创建匿名函数的函数:create function,但是代码逻辑只能写成字符串,这样看起来很晦涩并且不好维护,所以很少有人用。 实现闭包 将匿名函数在普通函数中当做参数传入,也可以被返回。这就实现了一个简单的闭包。 下边有三个例子 //例一 //在函数里定义一个匿名函数,并且调用它 function

php匿名函数的概念

青春壹個敷衍的年華 提交于 2019-11-30 00:58:34
#一.匿名函数和闭包的概念 ###1.1匿名函数 匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#, PHP直到5.3才开始真正支持匿名函数 。 什么是匿名函数 匿名函数是一类 不需要指定标示符 ,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数, 最常见应用是作为回调函数 ###1.2. 闭包(Closure) 说到匿名函数,就不得不提到闭包了,闭包是词法闭包(Lexical Closure)的简称, 是引用了自由变量的函数 , 这个被应用的自由变量将和这个函数一同存在,即使离开了创建它的环境也一样,所以闭包也可认为是有函数和与其相关引用组合而成的实体。 注解,这个自由变量你在外部创建的的,外部可能是函数或其他。 在一些语言中,在函数内定义另一个函数的时候,如果内部函数引用到外部函数的变量,则可能产生闭包。在运行外部函数时, 一个闭包就形成了。 这个词和匿名函数很容易被混用,其实这是两个不同的概念,这可能是因为很多语言实现匿名函数的时候允许形成闭包。 来源: oschina 链接: https://my.oschina.net/u/2980350/blog/810883

javascript语言精粹 读书笔记

為{幸葍}努か 提交于 2019-11-30 00:39:11
这是我目前度过最好的js方面的书,小而精,没有一句废话全是精华。想要全面理解javascript,这本书必读。 P6 避免使用 /* */注释 建议使用// P17 对象字面量是一种方便指定新对象的表示方法。属性名可以是标识符或者字符串。这些名字被当做字面量名而不是变量名来对待,所以对象的属性名在编译时才能知道。属性的值就是表达式。 P20 简单类型: 数字,字符串,布尔值,null值和undefined值 对象类型:数组,函数,正则表达式,对象。 对象是可变的键控集合,对象是属性的容器,每个属性都拥有名字和值。 属性的名字可以是包括空字符串在内的任意字符串,属性值可以是除undefined值之外的任何值。 P21 || 运算符可以用来填充默认值 var a=objecta.somenotexist || "unknowa"; P22 对象通过引用来传递 var a=b=c={}; a,b,c都引用同一个空对象 每个对象都连接到一个原型对象,并且它可以从中继承属性。 所有通过对象字面量创建的对象都连接到Object.prototype这个javascript中标准的对象。 当你创建一个新对象时,你可以选择某个对象作为它的原型。 我们这里给Object增加一个beget方法,这个方法创建一个使用原对象作为其原型的新对象。 if(typeof Object.beget!=

闭包案例---每隔一秒打印一个数

僤鯓⒐⒋嵵緔 提交于 2019-11-29 23:16:58
// 每个一秒打印一个数 // 方法一:利用闭包实现 for (var i = 1; i <= 5; i++) { (function (i) { setTimeout(() => { console.log(i); }, 1000 * i); })(i); } // 方法二: for (var i = 1; i <= 5; i++) { setTimeout((function (i) { return () => { console.log(i); } })(i), 1000 * i); } 来源: https://www.cnblogs.com/lixiaoxue/p/11228667.html

python之路——函数进阶

我的未来我决定 提交于 2019-11-29 21:30:32
阅读目录  楔子  命名空间和作用域  函数嵌套及作用域链  函数名的本质  闭包  本章小结 返回顶部 楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print(bigger) 之前是不是我告诉你们要把结果return回来你们就照做了?可是你们有没有想过,我们为什么要把结果返回?如果我们不返回m,直接在程序中打印,行不行? 来看结果: >>> def my_max(x,y): ... m = x if x>y else y ... >>> my_max(10,20) >>> print(m) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'm' is not defined 报错了!错误是“name 'm' is not defined”。变量m没有被定义。。。为啥?我明明定义了呀! 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的。 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。 但是

day4

此生再无相见时 提交于 2019-11-29 21:05:47
阅读目录 函数名的本质 闭包 装饰器 迭代器和生成器 迭代器 生成器函数 生成器表达式 匿名函数 递归函数 内置函数 回到顶部 函数名的本质 函数名本质上就是函数的内存地址 1.可以被引用 def func(): print('in func') f = func print(f) View Code 2.可以被当作容器类型的元素 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') l = [f1,f2,f3] d = {'f1':f1,'f2':f2,'f3':f3} #调用 l[0]() d['f2']() 函数被当作容易类型的元素 3.可以当作函数的参数和返回值 第一类对象(first-class object)指 1.可在运行期创建 2.可用作函数参数或返回值 3.可存入变量的实体。 第一类对象 *不明白?那就记住一句话,就当普通变量用 回到顶部 闭包函数 def func(): name = 'eva' def inner(): print(name) 闭包函数定义: 内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数 #函数内部定义的函数称为内部函数 由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

Python函数编程——闭包和装饰器

删除回忆录丶 提交于 2019-11-29 19:34:28
Python函数编程——闭包和装饰器 一、闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数)。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。也就是说,内部函数会在外部函数返回后被执行。而当这个内部函数执行时,它仍然必需访问其外部函数的局部变量、参数以及其他内部函数。这些局部变量、参数和函数声明(最初时)的值是外部函数返回时的值,但也会受到内部函数的影响。 def outer(): name = 'alex' def inner(): print("在inner里打印外层函数的变量",name) return inner # 注意这里只是返回inner的内存地址,并未执行 f = outer() # .inner at 0x1027621e0> f() # 相当于执行的是inner() 注意此时outer已经执行完毕,正常情况下outer里的内存都已经释放了,但此时由于闭包的存在,我们却还可以调用inner, 并且inner内部还调用了上一层outer里的name变量。这种粘粘糊糊的现象就是闭包。 闭包的意义: 返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。 闭包在哪会用? 请往下看

Js随笔

亡梦爱人 提交于 2019-11-29 19:03:05
![](https://img2018.cnblogs.com/blog/897017/201909/897017-20190916145815624-952420299.png) 一、常见知识点总结 1、闭包 闭包的本质在于“闭”和“包”,即把一些变量封闭起来,使其它程序访问不到,同时把这个封闭的东西打成包甩出来,让大家可以直接用这个包(函数)。最典型的实现之一是对象(或类)的私有成员, 看几个例子: function MyClass() { // 这是一个封闭在 MyClass 中的局部变量 var _name; // 这是一个甩出来的“包” this.getName = function() { return _name; }; // 这是另一个甩出来的“包” this.setName = function(name) { // 这保证了_name的第一个字母和空格后的第一个字母是大写 // 而且因为闭包的原因,_name 不可能被 MyCLass() 外的程序访问到 // 也就保证了上述命名规则的无例外执行 _name = name.replace(/^.|\s./g, function(s) { return s.toUpperCase(); }); }; } var p = new MyClass(); p.setName("james fancy"); console

#编译原理# 文法和内容(二)

偶尔善良 提交于 2019-11-29 17:35:18
文法和内容 编译原理笔记第二部分,内容参考:北航软院教师邵兵课堂课件及内容、张莉著《编译原理及编译程序构造》、国防工业出版社的《编译原理——学习指导与典型题解析》、 AlvinZH的学习笔记 以及个人理解 目前是包含了全部内容的版本,后续会推出精简版和复习知识点版 如有建议或错误错误欢迎在评论中指出或联系我:QQ:847590417 阅读目录 本章内容 2.1 形式语言基础 2.2 文法的非形式讨论 2.3 文法和语言的形式定义 2.4 语法树和二义性文法 2.5 句子的分析 2.6 有关文法的实用限制 2.7 文法的其他表示法 2.8 文法和语言分类 习题内知识 本章内容 重点:符号串、符号串集合的计算、文法、语言、递归、短语、句柄、语法树、文法的二义性、文法的使用限制、BNF表示文法、语法图、文法的分类。 2.1 形式语言基础 一、字母表和符号串 字母表:符号的非空有限集 符号:字母表中的元素 符号串:由符号拼接成的有穷序列 空符号串:没有任何符号的符号串 符号串的形式定义: 假设有一个字母表P:1.空符号串是P上的符号串;2.若x是P上的符号串,且a是字母表里的一个元素,则ax或xa(可以左,可以右,但只能一个不能同时加)是P上的符号串(一个符号也是符号串,a拼接ε);3.y是P上的符号串,当且仅当(iff)y是符合1.和2.的符号串。 二、符号串和符号串集合的运算 1