闭包与活动.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
闭包与活动

闭包与活动:解开寻址谜团 infinte 似乎某些程序员的集合是不相交的,就好像JS 程序员和玩编译原理和 CPU 指令的汇编程序员 就几乎没有交叉。前些日子讨论的火热的“作用域链”问题,说白了就是寻址问题,不过,这 个在C 中十分简单的问题却被JS 这个动态语言弄得很复杂。 正是因为JS 是动态语言,所以JS 的寻址是现场寻址,而非像C 一样,编译后确定。此外,JS 引入了this 指针,这是一个很麻烦的东西,因为它“隐式”作为一个参数传到函数里面。我们 先看“作用域链”话题中的例子: var testvar = window 属性; var o1 = {testvar:1, fun:function(){alert(o1: +this.testvar);}}; var o2 = {testvar:2, fun:function(){alert(o2: +this.testvar);}}; o1.fun(); // 1 o2.fun(); // 2 o1.fun.call(o2); //2 三次alert 结果并不相同,很有趣不是么?其实,所有的有趣、诡异的概念最后都可以归结到一 个问题上,那就是寻址。 JS 是静态还是动态作用域? 告诉你一个很不幸的消息,JS 是静态作用域的,或者说,变量寻址比perl 之类的动态作用域语 言要复杂得多。下面的代码是程序设计语言原理上面的例子: function big(){ var x = 1; eval(f1 = function(){echo(x)}); function f2(){var x = 2;f1()}; f2(); }; big(); 输出的是 1,和pascal、ada 如出一辙,虽然f1 是用eval 动态定义的。另外一个例子同样来 自 《程序设计语言原理》: function big2(){ var x = 1; function f2(){echo(x)}; //用x 的值产生一个输出 function f3(){var x = 3;f4(f2)}; function f4(f){var x = 4;f()}; f3(); } big2();//输出1:深绑定;输出4:浅绑定;输出3:特别绑定 输出的还是 1,说明JS 不仅是静态作用域,还是深绑定,这下事情出大了„„ 闭包===函数? Wikipedia 对Closure 的定义是“In computer science, a closure is a first-class function with free variables. Such a function is said to be closed over its free variables. ”,翻译成中文就是“一个闭包 是一个带有自己变量的 (第一型)函数”。“第一”类型在Aimingoo 的书中已经有论述,不过我 还是要提一下:“第一型函数”说的是函数可以当做变量传递、作函数的返回值等。 函数被存储时,需要在计算机内存中包含一些东西——如函数的代码(字符串或 OpCodes)、 参数表等。而函数调用时 (注意,是调用时)需要的东西则包括变量表、实参表(JavaScript 中 为 arguments)和被调用者(arguments.callee)。我们定义,如果某个函数被调用,则称 这个函数发起了一次活动。而活动,就是 “闭包”的重要成分。 活动的概念 为了解释函数(尤其是允许函数嵌套的语言中,比如Ada )运行时复杂的寻址问题,《程序设计 语言原理》一书中定义了活动记录实例 (ARI ,Activation record instance ,以下简称活动):它 是堆栈上一些记录,包括: 1. 函数实例地址 (arguments.callee) 2. 局部变量表 3. 实参表 (arguments 表) 4. this 指针 (也可看做实参的一个) 5. 返回值地址 6. 动态链接 这里,动态链接永远指向某个函数调用时所处的活动 (如b 活动时调用a,则a 的那次活动中, 动态链接指向调用它的b 的活动)。 静态链接 静态链接则描述了函数定义时,引擎执行的活动,因为函数的组织是有根树,所以所有的静态 链接汇总后一定会指向宿主(如window ),我们可以看

文档评论(0)

skvdnd51 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档