对自由变量的理解

转载 2015年11月18日 15:56:18

转载自: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的那个作用域中去查找,结果找到了。

 

这一节看似很轻松的把作用域链引出来,并讲完了。之所有轻松是有前几节的基础,否则将很难解释。

接下来咱们开始正式说说一直期待依旧的朋友——闭包。敬请期待下一节。


JS概念理解(三)——执行上下文、作用域与自由变量

执行上下文:         在我的理解中,执行上下文环境是在开始执行代码之前,需要把所有用到的东西拿出来,有的直接赋值,有的先声明出来,下面举例说明;...
  • srk19960903
  • srk19960903
  • 2017年07月23日 15:40
  • 176

求解Ax=0:主变量、自由变量、特殊解

上一篇简单介绍了列空间(column space)和零空间(null space),这一次主要介绍如何求出零空间内的向量,即主要讨论Ax=0。假设有矩阵A= ,略微观察一下其行和列可看出,列2是列1的...
  • xdfyoga1
  • xdfyoga1
  • 2014年07月02日 10:28
  • 3781

python中的闭包函数与自由变量

什么是闭包? 简单说,闭包就是根据不同的配置信息得到不同的结果 再来看看专业的解释:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变...
  • Virtual_Func
  • Virtual_Func
  • 2016年01月20日 21:35
  • 1673

python中lambda表达式中自由变量的坑

Python中函数是一个对象, 和整数,字符串等对象有很多相似之处,例如可以作为其他函数的参数或返回对象, Python中的函数还可以携带自由变量, 两者无疑极大增进了Python的表达力. 但...
  • u010949971
  • u010949971
  • 2017年04月11日 09:12
  • 954

从python API中命名和绑定认识局部变量,全局变量,自由变量

4. Execution model 执行模块 4.1. Structure of a program 程序结构 A Python program is constructed from code b...
  • kc_1197977022
  • kc_1197977022
  • 2017年04月16日 11:30
  • 462

JS - 自由变量与作用域链

先解释一下什么是“自由变量”。 在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。如下图 如上程序中,在调用fn()函数时,函数体中第...
  • J080624
  • J080624
  • 2017年01月16日 18:19
  • 550

js变量:局部变量、全局变量、闭包

局部变量、全局变量      var a =1; function test(){ alert(a); var a = 2; ale...
  • wiaiya
  • wiaiya
  • 2016年10月11日 19:09
  • 2200

对自由变量的理解

转载自:http://www.cnblogs.com/wangfupeng1988/p/3992795.html  建议查看原文 原文中还有其他更为精彩的文章 非常的经典 建议去看 先解释一下...
  • gwpJava
  • gwpJava
  • 2015年11月18日 15:56
  • 1614

稳扎稳打JS——自由变量

自由变量的作用域在程序运行前就已经确定! 自由变量相当于Java中的全局变量,它在外层作用域中声明,但在内层作用域中使用,如下所示: var a = 1; function fn(){ con...
  • u010425776
  • u010425776
  • 2016年09月17日 11:50
  • 1128

对自由的理解

自由不是放纵,是取舍
  • dogqiang
  • dogqiang
  • 2010年07月07日 21:53
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对自由变量的理解
举报原因:
原因补充:

(最多只允许输入30个字)