PHP和Go中的闭包变量作用域
关于闭包函数,之前在聊过。这里忽略了一点,不管是Go/Php/Python,闭包都存在局部变量的引用。
我们还是先看个例子:
PHP示例:
$list = [];
for ($i = 0; $i < 3; $i++) {
$list[] = function(){
global $i;
return $i;
};
}
foreach ($list as $fun) {
echo $fun().PHP_EOL;
}
以上输出:
相信很多朋友会说:不是应该输出 0 1 2吗?
好,继续,我们来看一个Golang的闭包示例:
package main
import "fmt"
func main() {
var list []func() int
for i := ; i < ; i++ {
list = append(list, func() int {
return i
})
}
for _, fun := range list {
fmt.Printf("%p = %v\n", fun, fun())
}
}
以上输出:(这里输出的内存地址会根据机器的不同而有所不同,甚至相同的程序在不同的机器上执行后也会有不同的内存地址)
0x48fd70 =
0x48fd70 =
0x48fd70 =
有兴趣的博友可以写个同样的Python示例,相信结果同出一辙。那么为什么结果是 3?
重点:闭包函数在调用完毕后,i变量就是从循环条件中的 i++开始,也就是 原本是 0,1,2循环结束,那么闭包调用结束后此时 i从i++开始也就是3.
其实这个不难理解:
PHP:
$list = [];
for ($i = 0; $i < 3; $i++) {
echo $i.PHP_EOL; // 输出 0 1 2
}
echo $i.PHP_EOL;// 输出 3
GO:
package main
import "fmt"
func main() {
var i int
for i = ; i < ; i++ {
fmt.Printf("i = %v\n", i)
}
fmt.Printf("i = %v\n", i)
}
i =
i =
i =
i =
结论:循环结束后变量i 从i++开始。
PHP和Go中的闭包变量作用域的更多相关文章
- php中include文件变量作用域的研究
原文:php中include文件变量作用域的研究 在php中我们有时候需要include一个文件.比如我前段时间在写一个框架的时候,打算用原生的php作为模板,然后写一个display方法引入模板文件 ...
- JavaScript 中的闭包和作用域链(读书笔记)
要想理解闭包,应当先理解JavaScript的作用域和作用域链. JavaScript有一个特性被称之为“声明提前(hoisting)”,即JavaScript函数里声明的所有变量(但不涉及赋值)都被 ...
- JS中for循环变量作用域--解决for循环异步执行的问题
被这个问题困惑了很久,终于在网上找到了答案,感谢~ 现在分享给大家~ js中如何让一个for循环走完之后,再去执行下面的语句? 这涉及for循环变量作用域的问题,js中作用域只有函数作用域和全局作用域 ...
- javascript关于闭包变量作用域
在项目中不时会遇到的一些小的问题以及解决办法: 1子函数调用父函数中的变量: 加return: var a=1; function num(){ var b=2; return b; } num()+ ...
- JavaScript中的闭包和作用域链
这部分几乎是JavaScript中最难的部分,也是面试官最爱问的地方. 下面的内容是我以前写的<JavaScript学习手册>中被客户删除的部分,理由听起来有点诡异:太难.
- JS中for循环变量作用域
http://www.cnblogs.com/zhus/p/6513741.html 博主写得很好
- 原型模式故事链(5)--JS变量作用域、作用域链、闭包
上一章 JS执行上下文.变量提升.函数声明 传送门:https://segmentfault.com/a/11... 本次我们主要讲讲变量作用域和闭包变量作用域:顾名思义:变量起作用的范围.变量分为全 ...
- javascript中的闭包解析
学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...
- javascript中的变量作用域以及变量提升
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...
随机推荐
- ARouter基础使用(一)
一个用于帮助 Android App 进行组件化改造的框架 —— 支持模块间的路由.通信.解耦1.新建一个Android项目 "ARouterDemo"2.添加依赖和配置 andr ...
- python爬虫第五天
cookie 我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态 ...
- Ubuntu上安装使用WeChat、TIM
WeChat可以直接到软件商店安装,不过是网页版...(其实个人感觉还行,就是什么都不能设置就挺蛋疼的,字体大小.背景什么的) 以下是网上找到的教程,在此总结一下: 下载地址:https://gith ...
- framework7 入门(数据获取和传递)
数据获取 framework7自带request方法 , var app = new Framework7({...});app.request(parameters) 或者 Framework7.r ...
- 浅谈MVC模式与MVVM模式的区别
MVC模式: M:Model(数据模型),用于存放数据 V:View(视图),也就是用户界面 C:Controller是Model和View的协调者,Controller把Model中的数据拿过来给V ...
- s:if 判断 s:property
判断<s:property value="XXX"/> 是否是空字符串 则:<s:if test=" XXX == '' ">< ...
- HBuilder git使用-分工合作
1.初始项目的创建 创建好项目,在项目名上右键,Team->共享 完成后,就实现了本地仓库的建立,另外你要注意现在创建的项目所有文件变成了红色,Git Repositories视图列出了相应的本 ...
- 字符串匹配(二)----KMP算法
什么是KMP算法: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法).KMP ...
- [Swift]LeetCode289. 生命游戏 | Game of Life
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...
- [Swift]LeetCode414. 第三大的数 | Third Maximum Number
Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...