16:闭包(Closures)重点.docx

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
闭包(Closures)介绍本章我们将介绍在JavaScript里大家经常来讨论的话题 —— 闭包(closure)。闭包其实大家都已经谈烂了。尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的。正如在前面的文章中提到的,这些文章都是系列文章,相互之间都是有关联的。因此,为了更好的理解本文要介绍的内容,建议先去阅读第14章作用域链和第12章变量对象。英文原文:/ecmascript/chapter-6-closures/概论在直接讨论ECMAScript闭包之前,还是有必要来看一下函数式编程中一些基本定义。众所周知,在函数式语言中(ECMAScript也支持这种风格),函数即是数据。就比方说,函数可以赋值给变量,可以当参数传递给其他函数,还可以从函数里返回等等。这类函数有特殊的名字和结构。定义A functional argument (“Funarg”) — is an argument which value is a function.函数式参数(“Funarg”) —— 是指值为函数的参数。例子:function exampleFunc(funArg) { funArg();}exampleFunc(function () { alert(funArg);});上述例子中funarg的实际参数其实是传递给exampleFunc的匿名函数。反过来,接受函数式参数的函数称为高阶函数(high-order function 简称:HOF)。还可以称作:函数式函数或者偏数理或操作符。上述例子中,exampleFunc 就是这样的函数。此前提到的,函数不仅可以作为参数,还可以作为返回值。这类以函数为返回值的函数称为带函数值的函数(functions with functional value or function valued functions)。(function functionValued() {returnfunction () { alert(returned function is called); };})()();可以以正常数据形式存在的函数(比方说:当参数传递,接受函数式参数或者以函数值返回)都称作第一类函数(一般说第一类对象)。在ECMAScript中,所有的函数都是第一类对象。函数可以作为正常数据存在(例如:当参数传递,接受函数式参数或者以函数值返回)都称作第一类函数(一般说第一类对象)。在ECMAScript中,所有的函数都是第一类对象。接受自己作为参数的函数,称为自应用函数(auto-applicative function 或者 self-applicative function):(function selfApplicative(funArg) {if (funArg funArg === selfApplicative) { alert(self-applicative);return; } selfApplicative(selfApplicative);})();以自己为返回值的函数称为自复制函数(auto-replicative function 或者 self-replicative function)。通常,“自复制”这个词用在文学作品中:(function selfReplicative() {return selfReplicative;})();自复制函数的其中一个比较有意思的模式是让仅接受集合的一个项作为参数来接受从而代替接受集合本身。// 接受集合的函数function registerModes(modes) { modes.forEach(registerMode, modes);}// 用法registerModes([roster, accounts, groups]);// 自复制函数的声明function modes(mode) { registerMode(mode); // 注册一个modereturn modes; // 返回函数自身}// 用法,modes链式调用modes(roster)(accounts)(groups)//有点类似:jQueryObject.addClass(a).toggle().removClass(b)但直接传集合用起来相对来说,比较有效并且直观。在函数式参数中定义的变量,在“funarg”激活时就能够访问了(因为存储上下文数据的变量对象每次在进入上下文的时候就创建出来了):function testFn(funArg) {// funarg激活时, 局部变量localVar可以访问了 funArg(10); // 20 funArg(20);

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档