对自由变量的理解
来源:互联网 发布:淘宝客 嗨推 编辑:程序博客网 时间:2024/05/20 07:36
转载自:http://www.cnblogs.com/wangfupeng1988/p/3992795.html 建议查看原文 原文中还有其他更为精彩的文章 非常的经典 建议去看
先解释一下什么是“自由变量”。
在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。如下图
如上程序中,在调用fn()函数时,函数体中第6行。取b的值就直接可以在fn作用域中取,因为b就是在这里定义的。而取x的值时,就需要到另一个作用域中取。到哪个作用域中取呢?
有人说过要到父作用域中取,其实有时候这种解释会产生歧义。例如:
所以,不要在用以上说法了。相比而言,用这句话描述会更加贴切——要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”,切记切记——其实这就是所谓的“静态作用域”。
对于本文第一段代码,在fn函数中,取自由变量x的值时,要到哪个作用域中取?——要到创建fn函数的那个作用域中取——无论fn函数将在哪里调用。
上面描述的只是跨一步作用域去寻找。寻找时 首先是在当前作用域中寻找 如果未找到 就到创建当前作用域的作用域中找 如果还没找到 则到创建了当前作用域的作用域的作用域中去找 以此类推
如果跨了一步,还没找到呢?——接着跨!——一直跨到全局作用域为止。要是在全局作用域中都没有找到,那就是真的没有了。
这个一步一步“跨”的路线,我们称之为——作用域链。
我们拿文字总结一下取自由变量时的这个“作用域链”过程:(假设a是自由量)
第一步,现在当前作用域查找a,如果有则获取并结束。如果没有则继续;
第二步,如果当前作用域是全局作用域,则证明a未定义,结束;否则继续;
第三步,(不是全局作用域,那就是函数作用域)将创建该函数的作用域作为当前作用域;
第四步,跳转到第一步。
以上代码中:第13行,fn()返回的是bar函数,赋值给x。执行x(),即执行bar函数代码。取b的值时,直接在fn作用域取出。取a的值时,试图在fn作用域取,但是取不到,只能转向创建fn的那个作用域中去查找,结果找到了。
这一节看似很轻松的把作用域链引出来,并讲完了。之所有轻松是有前几节的基础,否则将很难解释。
接下来咱们开始正式说说一直期待依旧的朋友——闭包。敬请期待下一节。
- 对自由变量的理解
- 对自由的理解
- 对变量的理解:
- 我对自由拼音中KEYPH数据结构的理解
- 对Javascript局部变量的理解
- [C++学习] 对const变量的理解.
- 对变量release与nil的理解
- 对线程条件变量的理解
- 对Volatile变量的理解和总结
- 对C++中返回对局部变量引用的理解
- 对java变量名的命名规则的理解
- 个人对静态类、静态方法、静态变量的理解
- 对线程同步之条件变量的理解
- 对C语言数据类型和变量的理解
- 对java中json格式变量数据的一些理解
- C语言初学--对全局变量和局部变量的理解
- Java基础语法--对变量&运算符的理解
- 对C++11条件变量的理解(逻辑)
- XML 数据解析案例
- 学生信息表管理
- mysql自动分区自动清理
- 简单的Java程序 简约不简单
- Liferay学习笔记:Liferay faces bridge
- 对自由变量的理解
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
- 使用 udev 高效、动态地管理 Linux 设备文件
- iOS7以后 视图Frame坐标起点发生的变化
- Scala中List的ListBuffer实现高效的遍历计算
- hdu 1599 find the mincost route
- 黑马程序员——Java基础——Object,包和多线程基础(一)
- Android手势监听类GestureDetector
- tomcat源码系列(一)--组合项目导入ide