03.html 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. <!DOCTYPE HTML>
  2. <html lang="" >
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  6. <title>写给初级JS程序员的JavaScript闭包(译) · 代码收集</title>
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  8. <meta name="description" content="">
  9. <meta name="generator" content="GitBook 3.1.1">
  10. <link rel="stylesheet" href="../../gitbook/style.css">
  11. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
  12. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-highlight/website.css">
  13. <meta name="HandheldFriendly" content="true"/>
  14. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  15. <meta name="apple-mobile-web-app-capable" content="yes">
  16. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  17. <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
  18. <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">
  19. <link rel="next" href="04.html" />
  20. <link rel="prev" href="02.html" />
  21. </head>
  22. <body>
  23. <div class="gb-page-wrapper">
  24. <header class="gb-page-header">
  25. <div class="container">
  26. <div id="book-search-input" role="search">
  27. <input type="text" placeholder="Type to search" />
  28. </div>
  29. <a href="../.." class="logo">
  30. <img src="../../gitbook/images/logo/128.png">
  31. <h1>代码收集</h1>
  32. </a>
  33. <a href="https://github.com/seamong/myBlogs/blob/doc/JavaScript/principle/03.md" target="_blank" class="btn btn-link pull-right hidden-xs">
  34. <i class="octicon octicon-mark-github"></i> 在GitHub编辑本页
  35. </a>
  36. <a href="../../faq.md" class="btn btn-link pull-right hidden-xs">
  37. F.A.Q
  38. </a>
  39. <a href="https://github.com/seamong/myBlogs/README.md" target="_blank" class="btn btn-link pull-right hidden-xs">
  40. 当前版本0.0.1
  41. </a>
  42. </div>
  43. </header>
  44. <div class="gb-page-body">
  45. <div class="gb-page-inner">
  46. <div class="container">
  47. <div class="row">
  48. <div class="col-md-3">
  49. <div class="panel panel-default">
  50. <div class="panel-heading">
  51. <h3 class="panel-title">介绍</h3>
  52. </div>
  53. <div class="list-group">
  54. <a href="../../" class="list-group-item ">
  55. 关于本文档
  56. </a>
  57. </div>
  58. </div>
  59. <div class="panel panel-default">
  60. <div class="panel-heading">
  61. <h3 class="panel-title">JavaScript</h3>
  62. </div>
  63. <div class="list-group">
  64. <a href="./" class="list-group-item ">
  65. <i class="octicon octicon-chevron-down"></i>
  66. 原理解析
  67. </a>
  68. <a href="0_data_type.html" class="list-group-item ">
  69. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  70. 数据类型
  71. </a>
  72. <a href="001_object.html" class="list-group-item ">
  73. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  74. Object
  75. </a>
  76. <a href="002_DOM.html" class="list-group-item ">
  77. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  78. DOM
  79. </a>
  80. <a href="01.html" class="list-group-item ">
  81. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  82. HTML DOM Document 对象
  83. </a>
  84. <a href="02.html" class="list-group-item ">
  85. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  86. 闭包
  87. </a>
  88. <a href="03.html" class="list-group-item active">
  89. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  90. 写给初级JS程序员的JavaScript闭包(译)
  91. </a>
  92. <a href="04.html" class="list-group-item ">
  93. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  94. 匿名函数和闭包
  95. </a>
  96. <a href="05.html" class="list-group-item ">
  97. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  98. instanceof运算符
  99. </a>
  100. <a href="06.html" class="list-group-item ">
  101. <i class="octicon octicon-chevron-down" style="opacity: 0"></i>
  102. JavaScript事件流
  103. </a>
  104. <a href="../cases/" class="list-group-item ">
  105. <i class="octicon octicon-chevron-right"></i>
  106. 案例解析
  107. </a>
  108. </div>
  109. </div>
  110. <div class="panel panel-default">
  111. <div class="panel-heading">
  112. <h3 class="panel-title">angular</h3>
  113. </div>
  114. <div class="list-group">
  115. <a href="../../angular/study_notes/" class="list-group-item ">
  116. <i class="octicon octicon-chevron-right"></i>
  117. Study notes
  118. </a>
  119. <a href="../../angular/ng.html" class="list-group-item ">
  120. ng
  121. </a>
  122. </div>
  123. </div>
  124. <div class="panel panel-default">
  125. <div class="panel-heading">
  126. <h3 class="panel-title">css</h3>
  127. </div>
  128. <div class="list-group">
  129. <a href="../../css/principle/" class="list-group-item ">
  130. 原理解析
  131. </a>
  132. <a href="../../css/cases/" class="list-group-item ">
  133. <i class="octicon octicon-chevron-right"></i>
  134. 案例收集
  135. </a>
  136. </div>
  137. </div>
  138. <div class="panel panel-default">
  139. <div class="panel-heading">
  140. <h3 class="panel-title">vue</h3>
  141. </div>
  142. <div class="list-group">
  143. <a href="../../vue/components/" class="list-group-item ">
  144. <i class="octicon octicon-chevron-right"></i>
  145. components
  146. </a>
  147. <a href="../../vue/router/" class="list-group-item ">
  148. <i class="octicon octicon-chevron-right"></i>
  149. router
  150. </a>
  151. <a href="../../vue/vuex/" class="list-group-item ">
  152. VUE
  153. </a>
  154. </div>
  155. </div>
  156. <div class="panel panel-default">
  157. <div class="panel-heading">
  158. <h3 class="panel-title">ubuntu</h3>
  159. </div>
  160. <div class="list-group">
  161. <a href="../../ubuntu/serves/" class="list-group-item ">
  162. <i class="octicon octicon-chevron-right"></i>
  163. 服务器生存指南
  164. </a>
  165. <a href="../../ubuntu/instruction.html" class="list-group-item ">
  166. 常用指令
  167. </a>
  168. <a href="../../ubuntu/software/" class="list-group-item ">
  169. 常用软件安装
  170. </a>
  171. </div>
  172. </div>
  173. <div class="panel panel-default">
  174. <div class="panel-heading">
  175. <h3 class="panel-title">GIT</h3>
  176. </div>
  177. <div class="list-group">
  178. <a href="../../git/git.html" class="list-group-item ">
  179. git 命令
  180. </a>
  181. <a href="../../git/push.html" class="list-group-item ">
  182. git~push
  183. </a>
  184. <a href="../../git/faq.html" class="list-group-item ">
  185. git~F.A.Q
  186. </a>
  187. </div>
  188. </div>
  189. <div class="panel panel-default">
  190. <div class="panel-heading">
  191. <h3 class="panel-title">NODE&NPM</h3>
  192. </div>
  193. <div class="list-group">
  194. <a href="../../node/0.html" class="list-group-item ">
  195. <i class="octicon octicon-chevron-right"></i>
  196. node
  197. </a>
  198. <a href="../../node/npm/0.html" class="list-group-item ">
  199. npm
  200. </a>
  201. </div>
  202. </div>
  203. <div class="panel panel-default">
  204. <div class="list-group">
  205. <a href="../../other/faq.html" class="list-group-item ">
  206. FAQ
  207. </a>
  208. <a href="../../other/examples.html" class="list-group-item ">
  209. Examples
  210. </a>
  211. </div>
  212. </div>
  213. </div>
  214. <div class="col-md-9">
  215. <div id="book-search-results">
  216. <div class="search-noresults">
  217. <div class="gb-markdown book-page-inner">
  218. <h1 id="&#x5199;&#x7ED9;&#x521D;&#x7EA7;js&#x7A0B;&#x5E8F;&#x5458;&#x7684;javascript&#x95ED;&#x5305;&#x8BD1;">&#x5199;&#x7ED9;&#x521D;&#x7EA7;JS&#x7A0B;&#x5E8F;&#x5458;&#x7684;JavaScript&#x95ED;&#x5305;(&#x8BD1;)</h1>
  219. <p><a href="http://web.archive.org/web/20080209105120/http:/blog.morrisjohns.com/javascript_closures_for_dummies" target="_blank">&#x539F;&#x6587;&#x94FE;&#x63A5;</a></p>
  220. <h1 id="&#x95ED;&#x5305;&#x4E0D;&#x662F;&#x9B54;&#x672F;">&#x95ED;&#x5305;&#x4E0D;&#x662F;&#x9B54;&#x672F;</h1>
  221. <blockquote>
  222. <p>&#x8FD9;&#x4E2A;&#x9875;&#x9762;&#x89E3;&#x91CA;&#x4E86;closures&#xFF0C;&#x4EE5;&#x4FBF;&#x7A0B;&#x5E8F;&#x5458;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x5B83;&#x4EEC; - &#x4F7F;&#x7528;&#x6709;&#x6548;&#x7684;JavaScript&#x4EE3;&#x7801;&#x3002;&#x5B83;&#x4E0D;&#x662F;&#x7528;&#x4E8E;&#x53E4;&#x8339;&#x6216;&#x529F;&#x80FD;&#x7A0B;&#x5E8F;&#x5458;&#x3002;
  223. &#x4E00;&#x65E6;&#x6838;&#x5FC3;&#x6982;&#x5FF5;&#x88AB;&#x89E3;&#x6784;&#xFF0C;&#x95ED;&#x5305;&#x4E0D;&#x96BE;&#x7406;&#x89E3;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x4ED6;&#x4EEC;&#x4E0D;&#x53EF;&#x80FD;&#x901A;&#x8FC7;&#x9605;&#x8BFB;&#x4EFB;&#x4F55;&#x5B66;&#x672F;&#x8BBA;&#x6587;&#x6216;&#x9762;&#x5411;&#x5B66;&#x672F;&#x7684;&#x4FE1;&#x606F;&#x6765;&#x4E86;&#x89E3;&#x4ED6;&#x4EEC;&#xFF01;
  224. &#x672C;&#x6587;&#x4E3B;&#x8981;&#x9762;&#x5411;&#x6709;&#x4E3B;&#x6D41;&#x8BED;&#x8A00;&#x7F16;&#x7A0B;&#x7ECF;&#x9A8C;&#x7684;&#x7A0B;&#x5E8F;&#x5458;&#xFF0C;&#x4ED6;&#x4EEC;&#x53EF;&#x4EE5;&#x9605;&#x8BFB;&#x4EE5;&#x4E0B;JavaScript&#x51FD;&#x6570;&#xFF1A;</p>
  225. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sayHello</span>(<span class="hljs-params">name</span>) </span>{
  226. <span class="hljs-keyword">var</span> text = <span class="hljs-string">&apos;Hello &apos;</span> + name;
  227. <span class="hljs-keyword">var</span> say = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(text); }
  228. say();
  229. }
  230. sayHello(<span class="hljs-string">&apos;Joe&apos;</span>);
  231. </code></pre>
  232. </blockquote>
  233. <h3 id="&#x95ED;&#x5305;&#x7684;&#x5B9E;&#x4F8B;">&#x95ED;&#x5305;&#x7684;&#x5B9E;&#x4F8B;</h3>
  234. <blockquote>
  235. <p>&#x4E24;&#x53E5;&#x8BDD;&#x6458;&#x8981;&#xFF1A;<br></p>
  236. <h5 id="&#xA0;&#xA0;&#xA0;&#xA0;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x5F15;&#x7528;&#x5176;&#x8303;&#x56F4;&#x5185;&#x7684;&#x53D8;&#x91CF;&#xFF08;&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x58F0;&#x660E;&#x65F6;&#xFF09;&#xFF0C;&#x88AB;&#x8D4B;&#x503C;&#x7ED9;&#x53D8;&#x91CF;&#xFF0C;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x7ED9;&#x51FD;&#x6570;&#x6216;&#x4F5C;&#x4E3A;&#x51FD;&#x6570;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#x3002;">&#xA0;&#xA0;&#xA0;&#xA0;.&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x5F15;&#x7528;&#x5176;&#x8303;&#x56F4;&#x5185;&#x7684;&#x53D8;&#x91CF;&#xFF08;&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x58F0;&#x660E;&#x65F6;&#xFF09;&#xFF0C;&#x88AB;&#x8D4B;&#x503C;&#x7ED9;&#x53D8;&#x91CF;&#xFF0C;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x7ED9;&#x51FD;&#x6570;&#x6216;&#x4F5C;&#x4E3A;&#x51FD;&#x6570;&#x7ED3;&#x679C;&#x8FD4;&#x56DE;&#x7684;&#x8868;&#x8FBE;&#x5F0F;&#x3002;<br></h5>
  237. <h5 id="&#xA0;&#xA0;&#xA0;&#xA0;&#x95ED;&#x5305;&#x662F;&#x4E00;&#x4E2A;&#x5806;&#x6808;&#x6846;&#x67B6;&#xFF0C;&#x5F53;&#x51FD;&#x6570;&#x5F00;&#x59CB;&#x6267;&#x884C;&#x65F6;&#x88AB;&#x5206;&#x914D;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x4E4B;&#x540E;&#x4E0D;&#x88AB;&#x91CA;&#x653E;&#xFF08;&#x5C31;&#x597D;&#x50CF;&#x5806;&#x6808;&#x6846;&#x67B6;&#x5728;&#x5806;&#x4E0A;&#x5206;&#x914D;&#x800C;&#x4E0D;&#x662F;&#x5806;&#x6808;&#xFF01;&#xFF09;&#x3002;">&#xA0;&#xA0;&#xA0;&#xA0;.&#x95ED;&#x5305;&#x662F;&#x4E00;&#x4E2A;&#x5806;&#x6808;&#x6846;&#x67B6;&#xFF0C;&#x5F53;&#x51FD;&#x6570;&#x5F00;&#x59CB;&#x6267;&#x884C;&#x65F6;&#x88AB;&#x5206;&#x914D;&#xFF0C;&#x5E76;&#x4E14;&#x5728;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x4E4B;&#x540E;&#x4E0D;&#x88AB;&#x91CA;&#x653E;&#xFF08;&#x5C31;&#x597D;&#x50CF;&#x201C;&#x5806;&#x6808;&#x6846;&#x67B6;&#x201D;&#x5728;&#x5806;&#x4E0A;&#x5206;&#x914D;&#x800C;&#x4E0D;&#x662F;&#x5806;&#x6808;&#xFF01;&#xFF09;&#x3002;<br></h5>
  238. </blockquote>
  239. <p>&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x8FD4;&#x56DE;&#x5BF9;&#x51FD;&#x6570;&#x7684;&#x5F15;&#x7528;&#xFF1A;</p>
  240. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sayHello2</span>(<span class="hljs-params">name</span>) </span>{
  241. <span class="hljs-keyword">var</span> text = <span class="hljs-string">&apos;Hello &apos;</span> + name; <span class="hljs-comment">// Local variable</span>
  242. <span class="hljs-keyword">var</span> say = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(text); }
  243. <span class="hljs-keyword">return</span> say;
  244. }
  245. <span class="hljs-keyword">var</span> say2 = sayHello2(<span class="hljs-string">&apos;Bob&apos;</span>);
  246. say2(); <span class="hljs-comment">// logs &quot;Hello Bob&quot;</span>
  247. </code></pre>
  248. <blockquote>
  249. <p>&#x5927;&#x591A;&#x6570;JavaScript&#x7A0B;&#x5E8F;&#x5458;&#x5C06;&#x4F1A;&#x7406;&#x89E3;&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x4E2D;&#x5982;&#x4F55;&#x5C06;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x7684;&#x5F15;&#x7528;&#x8FD4;&#x56DE;&#x7ED9;&#x4E00;&#x4E2A;&#x53D8;&#x91CF;&#x3002;&#x5982;&#x679C;&#x4F60;&#x6CA1;&#x6709;&#xFF0C;&#x90A3;&#x4E48;&#x4F60;&#x9700;&#x8981;&#x5728;&#x4F60;&#x53EF;&#x4EE5;&#x5B66;&#x4E60;&#x95ED;&#x5305;&#x3002;AC&#x7A0B;&#x5E8F;&#x5458;&#x4F1A;&#x8BA4;&#x4E3A;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x6307;&#x5411;&#x51FD;&#x6570;&#x7684;&#x6307;&#x9488;&#xFF0C;&#x53D8;&#x91CF;sayAlert&#x548C;say2&#x90FD;&#x662F;&#x6307;&#x5411;&#x51FD;&#x6570;&#x7684;&#x6307;&#x9488;&#x3002;</p>
  250. <p>&#x5728;&#x6307;&#x5411;&#x51FD;&#x6570;&#x7684;C&#x6307;&#x9488;&#x548C;&#x5BF9;&#x51FD;&#x6570;&#x7684;JavaScript&#x5F15;&#x7528;&#x4E4B;&#x95F4;&#x5B58;&#x5728;&#x5173;&#x952E;&#x7684;&#x533A;&#x522B;&#x3002;&#x5728;JavaScript&#x4E2D;&#xFF0C;&#x60A8;&#x53EF;&#x4EE5;&#x5C06;&#x51FD;&#x6570;&#x5F15;&#x7528;&#x53D8;&#x91CF;&#x770B;&#x4F5C;&#x5177;&#x6709;&#x6307;&#x5411;&#x51FD;&#x6570;&#x7684;&#x6307;&#x9488; &#x4EE5;&#x53CA;&#x6307;&#x5411;&#x95ED;&#x5305;&#x7684;&#x9690;&#x85CF;&#x6307;&#x9488;&#x3002;</p>
  251. <p>&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x6709;&#x4E00;&#x4E2A;&#x95ED;&#x5305;&#xFF0C;&#x56E0;&#x4E3A;&#x533F;&#x540D;&#x51FD;&#x6570;function&#xFF08;&#xFF09;{alert&#xFF08;text&#xFF09;; } &#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x4E2D;&#x58F0;&#x660E;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#x4E3A;sayHello2&#xFF08;&#xFF09;&#x3002;&#x5728;JavaScript&#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x4E2D;&#x4F7F;&#x7528;function&#x5173;&#x952E;&#x5B57;&#xFF0C;&#x5219;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x95ED;&#x5305;&#x3002;</p>
  252. <p>&#x5728;C&#x548C;&#x5927;&#x591A;&#x6570;&#x5176;&#x4ED6;&#x5E38;&#x7528;&#x8BED;&#x8A00;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x540E;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x4E0D;&#x518D;&#x53EF;&#x8BBF;&#x95EE;&#xFF0C;&#x56E0;&#x4E3A;&#x5806;&#x6808;&#x5E27;&#x88AB;&#x9500;&#x6BC1;&#x3002;</p>
  253. <p>&#x5728;JavaScript&#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x4E2D;&#x58F0;&#x660E;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x90A3;&#x4E48;&#x5728;&#x4ECE;&#x8C03;&#x7528;&#x7684;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x540E;&#xFF0C;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x4ECD;&#x7136;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x3002;&#x8FD9;&#x662F;&#x4E0A;&#x9762;&#x6F14;&#x793A;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x8C03;&#x7528;&#x51FD;&#x6570;say2&#xFF08;&#xFF09;; &#x4E4B;&#x540E;&#x6211;&#x4EEC;&#x4ECE;sayHello2&#xFF08;&#xFF09;&#x8FD4;&#x56DE;&#x3002;&#x8BF7;&#x6CE8;&#x610F;&#xFF0C;&#x6211;&#x4EEC;&#x8C03;&#x7528;&#x7684;&#x4EE3;&#x7801;&#x5F15;&#x7528;&#x53D8;&#x91CF;text&#xFF0C;&#x5B83;&#x662F;&#x51FD;&#x6570;sayHello2&#xFF08;&#xFF09;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x3002;</p>
  254. </blockquote>
  255. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(text); } <span class="hljs-comment">// Output of say2.toString();</span>
  256. </code></pre>
  257. <blockquote>
  258. <p>&#x770B;&#x770B;&#x8F93;&#x51FA;say2.toString()&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4EE3;&#x7801;&#x5F15;&#x7528;&#x7684;&#x53D8;&#x91CF;text&#x3002;&#x533F;&#x540D;&#x51FD;&#x6570;&#x53EF;&#x4EE5;&#x5F15;&#x7528;text&#x4FDD;&#x5B58;&#x503C;&#x7684;&#x503C;&apos;Hello Bob&apos;&#xFF0C;&#x56E0;&#x4E3A;&#x5C40;&#x90E8;&#x53D8;&#x91CF;sayHello2()&#x4FDD;&#x5B58;&#x5728;&#x95ED;&#x5305;&#x4E2D;&#x3002;</p>
  259. <p>&#x795E;&#x5947;&#x7684;&#x662F;&#xFF0C;&#x5728;JavaScript&#x4E2D;&#xFF0C;&#x51FD;&#x6570;&#x5F15;&#x7528;&#x8FD8;&#x5177;&#x6709;&#x5BF9;&#x5176;&#x521B;&#x5EFA;&#x7684;&#x95ED;&#x5305;&#x7684;&#x79D8;&#x5BC6;&#x5F15;&#x7528; - &#x7C7B;&#x4F3C;&#x4E8E;&#x5982;&#x4F55;&#x59D4;&#x6258;&#x662F;&#x65B9;&#x6CD5;&#x6307;&#x9488;&#x52A0;&#x4E0A;&#x5BF9;&#x5BF9;&#x8C61;&#x7684;&#x79D8;&#x5BC6;&#x5F15;&#x7528;&#x3002;</p>
  260. </blockquote>
  261. <hr>
  262. <h1 id="&#x66F4;&#x591A;&#x4F8B;&#x5B50;">&#x66F4;&#x591A;&#x4F8B;&#x5B50;</h1>
  263. <p>&#x51FA;&#x4E8E;&#x67D0;&#x79CD;&#x539F;&#x56E0;&#xFF0C;&#x5F53;&#x4F60;&#x9605;&#x8BFB;&#x5173;&#x4E8E;&#x5B83;&#x4EEC;&#x7684;&#x95ED;&#x5305;&#x4F3C;&#x4E4E;&#x771F;&#x7684;&#x5F88;&#x96BE;&#x7406;&#x89E3;&#xFF0C;&#x4F46;&#x5F53;&#x4F60;&#x770B;&#x5230;&#x4E00;&#x4E9B;&#x4F8B;&#x5B50;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x70B9;&#x51FB;&#x4ED6;&#x4EEC;&#x7684;&#x5DE5;&#x4F5C;&#xFF08;&#x5B83;&#x82B1;&#x4E86;&#x6211;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#xFF09;&#x3002;&#x6211;&#x5EFA;&#x8BAE;&#x4ED4;&#x7EC6;&#x9605;&#x8BFB;&#x793A;&#x4F8B;&#xFF0C;&#x76F4;&#x5230;&#x4F60;&#x4E86;&#x89E3;&#x5B83;&#x4EEC;&#x5982;&#x4F55;&#x5DE5;&#x4F5C;&#x3002;&#x5982;&#x679C;&#x4F60;&#x5F00;&#x59CB;&#x4F7F;&#x7528;&#x95ED;&#x5305;&#x6CA1;&#x6709;&#x5B8C;&#x5168;&#x4E86;&#x89E3;&#x5B83;&#x4EEC;&#x5982;&#x4F55;&#x5DE5;&#x4F5C;&#xFF0C;&#x4F60;&#x5F88;&#x5FEB;&#x5C31;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E9B;&#x975E;&#x5E38;&#x53E4;&#x602A;&#x7684;&#x9519;&#x8BEF;&#xFF01;</p>
  264. <h3 id="&#x4F8B;3">&#x4F8B;3</h3>
  265. <blockquote>
  266. <p>&#x6B64;&#x793A;&#x4F8B;&#x663E;&#x793A;&#x4E0D;&#x590D;&#x5236;&#x5C40;&#x90E8;&#x53D8;&#x91CF; - &#x5B83;&#x4EEC;&#x901A;&#x8FC7;&#x5F15;&#x7528;&#x4FDD;&#x7559;&#x3002;&#x5B83;&#x662F;&#x4E00;&#x79CD;&#x50CF;&#x5728;&#x5916;&#x90E8;&#x51FD;&#x6570;&#x9000;&#x51FA;&#x65F6;&#x5728;&#x5185;&#x5B58;&#x4E2D;&#x4FDD;&#x7559;&#x4E00;&#x4E2A;&#x5806;&#x6808;&#x6846;&#x67B6;&#xFF01;</p>
  267. </blockquote>
  268. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">say667</span>(<span class="hljs-params"></span>) </span>{
  269. <span class="hljs-comment">// Local variable that ends up within closure</span>
  270. <span class="hljs-keyword">var</span> num = <span class="hljs-number">42</span>;
  271. <span class="hljs-keyword">var</span> say = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(num); }
  272. num++;
  273. <span class="hljs-keyword">return</span> say;
  274. }
  275. <span class="hljs-keyword">var</span> sayNumber = say667();
  276. sayNumber(); <span class="hljs-comment">// logs 43</span>
  277. </code></pre>
  278. <h3 id="&#x4F8B;4">&#x4F8B;4</h3>
  279. <blockquote>
  280. <p>&#x6240;&#x6709;&#x4E09;&#x4E2A;&#x5168;&#x5C40;&#x51FD;&#x6570;&#x5177;&#x6709;&#x5BF9;&#x540C;&#x4E00;&#x95ED;&#x5305;&#x7684;&#x516C;&#x5171;&#x5F15;&#x7528;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x90FD;&#x5728;&#x5355;&#x4E2A;&#x8C03;&#x7528;&#x4E2D;&#x58F0;&#x660E;setupSomeGlobals()&#x3002;<br></p>
  281. </blockquote>
  282. <pre><code class="lang-js"><span class="hljs-keyword">var</span> gLogNumber, gIncreaseNumber, gSetNumber;
  283. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setupSomeGlobals</span>(<span class="hljs-params"></span>) </span>{
  284. <span class="hljs-comment">// Local variable that ends up within closure</span>
  285. <span class="hljs-keyword">var</span> num = <span class="hljs-number">42</span>;
  286. <span class="hljs-comment">// Store some references to functions as global variables</span>
  287. gLogNumber = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(num); }
  288. gIncreaseNumber = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ num++; }
  289. gSetNumber = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>) </span>{ num = x; }
  290. }
  291. setupSomeGlobals();
  292. gIncreaseNumber();
  293. gLogNumber(); <span class="hljs-comment">// 43</span>
  294. gSetNumber(<span class="hljs-number">5</span>);
  295. gLogNumber(); <span class="hljs-comment">// 5</span>
  296. <span class="hljs-keyword">var</span> oldLog = gLogNumber;
  297. setupSomeGlobals();
  298. gLogNumber(); <span class="hljs-comment">// 42</span>
  299. oldLog() <span class="hljs-comment">// 5</span>
  300. </code></pre>
  301. <blockquote>
  302. <p>&#x8FD9;&#x4E09;&#x4E2A;&#x51FD;&#x6570;&#x5177;&#x6709;&#x5BF9;&#x540C;&#x4E00;&#x95ED;&#x5305;&#x7684;&#x5171;&#x4EAB;&#x8BBF;&#x95EE; - setupSomeGlobals()&#x5F53;&#x5B9A;&#x4E49;&#x4E09;&#x4E2A;&#x51FD;&#x6570;&#x65F6;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x3002;<br>
  303. &#x6CE8;&#x610F;&#xFF0C;&#x5728;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x5982;&#x679C;setupSomeGlobals()&#x518D;&#x6B21;&#x8C03;&#x7528;&#xFF0C;&#x5219;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x95ED;&#x5305;&#xFF08;stack-frame&#xFF01;&#xFF09;&#x3002;&#x8001;gLogNumber&#xFF0C;gIncreaseNumber&#xFF0C;gSetNumber&#x53D8;&#x91CF;&#x5C06;&#x8986;&#x76D6;&#x65B0;&#x7684;&#x5177;&#x6709;&#x65B0;&#x529F;&#x80FD;&#x5173;&#x95ED;&#x3002;&#xFF08;&#x5728;JavaScript&#x4E2D;&#xFF0C;&#x5F53;&#x4F60;&#x58F0;&#x660E;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x5185;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x91CC;&#x9762;&#x7684;&#x529F;&#x80FD;&#xFF08;s&#xFF09;&#x662F;/&#x518D;&#x6B21;&#x91CD;&#x65B0;&#x521B;&#x5EFA;&#x6BCF;&#x4E2A;&#x5916;&#x90E8;&#x51FD;&#x6570;&#x88AB;&#x8C03;&#x7528;&#x65F6;&#xFF09;&#x3002;</p>
  304. </blockquote>
  305. <h3 id="&#x4F8B;5">&#x4F8B;5</h3>
  306. <blockquote>
  307. <p>&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x771F;&#x6B63;&#x7684;&#x56F0;&#x6270;&#xFF0C;&#x8BB8;&#x591A;&#x4EBA;&#xFF0C;&#x6240;&#x4EE5;&#x4F60;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x5B83;&#x3002;&#x8981;&#x975E;&#x5E38;&#x5C0F;&#x5FC3;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x5728;&#x4E00;&#x4E2A;&#x5FAA;&#x73AF;&#x4E2D;&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF1A;&#x4ECE;&#x95ED;&#x5305;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x4E0D;&#x4F1A;&#x50CF;&#x4F60;&#x53EF;&#x80FD;&#x4F1A;&#x60F3;&#x7684;&#x90A3;&#x6837;&#x3002;</p>
  308. </blockquote>
  309. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">buildList</span>(<span class="hljs-params">list</span>) </span>{
  310. <span class="hljs-keyword">var</span> result = [];
  311. <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; list.length; i++) {
  312. <span class="hljs-keyword">var</span> item = <span class="hljs-string">&apos;item&apos;</span> + i;
  313. result.push( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{<span class="hljs-built_in">console</span>.log(item + <span class="hljs-string">&apos; &apos;</span> + list[i])} );
  314. }
  315. <span class="hljs-keyword">return</span> result;
  316. }
  317. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">testList</span>(<span class="hljs-params"></span>) </span>{
  318. <span class="hljs-keyword">var</span> fnlist = buildList([<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>]);
  319. <span class="hljs-comment">// Using j only to help prevent confusion -- could use i.</span>
  320. <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> j = <span class="hljs-number">0</span>; j &lt; fnlist.length; j++) {
  321. fnlist[j]();
  322. }
  323. }
  324. testList() <span class="hljs-comment">//logs &quot;item2 undefined&quot; 3 times</span>
  325. </code></pre>
  326. <blockquote>
  327. <p>line result.push&#xFF08;function&#xFF08;&#xFF09;{console.log&#xFF08;item +&apos;&apos;+ list [i]&#xFF09;}&#x5728;&#x7ED3;&#x679C;&#x6570;&#x7EC4;&#x4E2D;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5BF9;&#x533F;&#x540D;&#x51FD;&#x6570;&#x7684;&#x5F15;&#x7528;&#x4E09;&#x6B21;&#x3002;&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x719F;&#x6089;&#x533F;&#x540D;&#x51FD;&#x6570;&#xFF0C; &#x5C31;&#x5982;&#xFF1A;</p>
  328. </blockquote>
  329. <pre><code class="lang-js">pointer = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{<span class="hljs-built_in">console</span>.log(item + <span class="hljs-string">&apos; &apos;</span> + list[i])};
  330. result.push(pointer);
  331. </code></pre>
  332. <blockquote>
  333. <p>&#x6CE8;&#x610F;&#xFF0C;&#x5F53;&#x8FD0;&#x884C;&#x793A;&#x4F8B;&#x65F6;&#xFF0C;&#x201C;item2 undefined&#x201D;&#x4F1A;&#x63D0;&#x9192;&#x4E09;&#x6B21;&#xFF01; &#x8FD9;&#x662F;&#x56E0;&#x4E3A;&#x5C31;&#x50CF;&#x524D;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4E00;&#x6837;&#xFF0C;buildList&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x95ED;&#x5305;&#x3002; &#x5F53;&#x5728;fnlist [j]&#xFF08;&#xFF09;&#x4E0A;&#x8C03;&#x7528;&#x533F;&#x540D;&#x51FD;&#x6570;&#x65F6;; &#x5B83;&#x4EEC;&#x90FD;&#x4F7F;&#x7528;&#x76F8;&#x540C;&#x7684;&#x5355;&#x4E2A;&#x95ED;&#x5305;&#xFF0C;&#x5E76;&#x4E14;&#x5B83;&#x4EEC;&#x4F7F;&#x7528;&#x8BE5;&#x95ED;&#x5305;&#x5185;&#x7684;i&#x548C;&#x9879;&#x7684;&#x5F53;&#x524D;&#x503C;&#xFF08;&#x5176;&#x4E2D;i&#x5177;&#x6709;&#x503C;3&#xFF0C;&#x56E0;&#x4E3A;&#x5FAA;&#x73AF;&#x5DF2;&#x5B8C;&#x6210;&#xFF0C;&#x5E76;&#x4E14;&#x9879;&#x5177;&#x6709;&#x503C;&apos;item2&apos;&#xFF09;&#x3002; &#x6CE8;&#x610F;&#xFF0C;&#x6211;&#x4EEC;&#x4ECE;0&#x7D22;&#x5F15;&#xFF0C;&#x56E0;&#x6B64;&#x9879;&#x76EE;&#x7684;&#x503C;&#x4E3A;item2&#x3002; &#x5E76;&#x4E14;i ++&#x5C06;i&#x589E;&#x52A0;&#x5230;&#x503C;3&#x3002;</p>
  334. </blockquote>
  335. <h3 id="&#x4F8B;6">&#x4F8B;6</h3>
  336. <blockquote>
  337. <p>&#x6B64;&#x793A;&#x4F8B;&#x663E;&#x793A;&#xFF0C;&#x95ED;&#x5305;&#x5305;&#x542B;&#x5728;&#x9000;&#x51FA;&#x524D;&#x5728;&#x5916;&#x90E8;&#x51FD;&#x6570;&#x4E2D;&#x58F0;&#x660E;&#x7684;&#x4EFB;&#x4F55;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x3002; &#x6CE8;&#x610F;&#xFF0C;&#x53D8;&#x91CF;alice&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x5728;&#x533F;&#x540D;&#x51FD;&#x6570;&#x4E4B;&#x540E;&#x58F0;&#x660E;&#x7684;&#x3002; &#x533F;&#x540D;&#x51FD;&#x6570;&#x9996;&#x5148;&#x58F0;&#x660E;; &#x5E76;&#x4E14;&#x5F53;&#x8C03;&#x7528;&#x8BE5;&#x51FD;&#x6570;&#x65F6;&#xFF0C;&#x5B83;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;alice&#x53D8;&#x91CF;&#xFF0C;&#x56E0;&#x4E3A;alice&#x5728;&#x540C;&#x4E00;&#x8303;&#x56F4;&#x5185;&#xFF08;JavaScript&#x53D8;&#x91CF;&#x63D0;&#x5347;&#xFF09;&#x3002; &#x53E6;&#x5916;sayAlice&#xFF08;&#xFF09;&#xFF08;&#xFF09;&#x53EA;&#x662F;&#x76F4;&#x63A5;&#x8C03;&#x7528;&#x4ECE;sayAlice&#xFF08;&#xFF09;&#x8FD4;&#x56DE;&#x7684;&#x51FD;&#x6570;&#x5F15;&#x7528; - &#x5B83;&#x5B8C;&#x5168;&#x4E0E;&#x4EE5;&#x524D;&#x505A;&#x8FC7;&#x7684;&#x76F8;&#x540C;&#xFF0C;&#x4F46;&#x6CA1;&#x6709;&#x4E34;&#x65F6;&#x53D8;&#x91CF;&#x3002;</p>
  338. </blockquote>
  339. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sayAlice</span>(<span class="hljs-params"></span>) </span>{
  340. <span class="hljs-keyword">var</span> say = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(alice); }
  341. <span class="hljs-comment">// Local variable that ends up within closure</span>
  342. <span class="hljs-keyword">var</span> alice = <span class="hljs-string">&apos;Hello Alice&apos;</span>;
  343. <span class="hljs-keyword">return</span> say;
  344. }
  345. sayAlice()();<span class="hljs-comment">// logs &quot;Hello Alice&quot;</span>
  346. </code></pre>
  347. <blockquote>
  348. <p>Tricky&#xFF1A;&#x8FD8;&#x8981;&#x6CE8;&#x610F;&#xFF0C;say&#x53D8;&#x91CF;&#x4E5F;&#x5728;&#x95ED;&#x5305;&#x5185;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x88AB;&#x53EF;&#x80FD;&#x88AB;&#x58F0;&#x660E;&#x7684;&#x4EFB;&#x4F55;&#x5176;&#x4ED6;&#x51FD;&#x6570;&#x8BBF;&#x95EE;sayAlice()&#xFF0C;&#x6216;&#x8005;&#x5B83;&#x53EF;&#x4EE5;&#x5728;&#x5185;&#x90E8;&#x51FD;&#x6570;&#x5185;&#x88AB;&#x9012;&#x5F52;&#x5730;&#x8BBF;&#x95EE;&#x3002;</p>
  349. </blockquote>
  350. <h3 id="&#x4F8B;7">&#x4F8B;7</h3>
  351. <blockquote>
  352. <p>&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x663E;&#x793A;&#x6BCF;&#x4E2A;&#x8C03;&#x7528;&#x4E3A;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5355;&#x72EC;&#x7684;&#x95ED;&#x5305;&#x3002; &#x6BCF;&#x4E2A;&#x51FD;&#x6570;&#x58F0;&#x660E;&#x6CA1;&#x6709;&#x5355;&#x4E2A;&#x95ED;&#x5305;&#x3002; &#x6BCF;&#x4E2A;&#x51FD;&#x6570;&#x7684;&#x8C03;&#x7528;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x95ED;&#x5305;&#x3002;</p>
  353. </blockquote>
  354. <pre><code class="lang-js"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">newClosure</span>(<span class="hljs-params">someNum, someRef</span>) </span>{
  355. <span class="hljs-comment">// Local variables that end up within closure</span>
  356. <span class="hljs-keyword">var</span> num = someNum;
  357. <span class="hljs-keyword">var</span> anArray = [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>];
  358. <span class="hljs-keyword">var</span> ref = someRef;
  359. <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>) </span>{
  360. num += x;
  361. anArray.push(num);
  362. <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&apos;num: &apos;</span> + num +
  363. <span class="hljs-string">&apos;; anArray: &apos;</span> + anArray.toString() +
  364. <span class="hljs-string">&apos;; ref.someVar: &apos;</span> + ref.someVar + <span class="hljs-string">&apos;;&apos;</span>);
  365. }
  366. }
  367. obj = {someVar: <span class="hljs-number">4</span>};
  368. fn1 = newClosure(<span class="hljs-number">4</span>, obj);
  369. fn2 = newClosure(<span class="hljs-number">5</span>, obj);
  370. fn1(<span class="hljs-number">1</span>); <span class="hljs-comment">// num: 5; anArray: 1,2,3,5; ref.someVar: 4;</span>
  371. fn2(<span class="hljs-number">1</span>); <span class="hljs-comment">// num: 6; anArray: 1,2,3,6; ref.someVar: 4;</span>
  372. obj.someVar++;
  373. fn1(<span class="hljs-number">2</span>); <span class="hljs-comment">// num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;</span>
  374. fn2(<span class="hljs-number">2</span>); <span class="hljs-comment">// num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;</span>
  375. </code></pre>
  376. <hr>
  377. <h2 id="&#x6982;&#x8981;">&#x6982;&#x8981;</h2>
  378. <blockquote>
  379. <p>&#x5982;&#x679C;&#x4E00;&#x5207;&#x4F3C;&#x4E4E;&#x5B8C;&#x5168;&#x4E0D;&#x6E05;&#x695A;&#xFF0C;&#x90A3;&#x4E48;&#x6700;&#x597D;&#x7684;&#x529E;&#x6CD5;&#x662F;&#x73A9;&#x7684;&#x4F8B;&#x5B50;&#x3002;&#x9605;&#x8BFB;&#x89E3;&#x91CA;&#x6BD4;&#x7406;&#x89E3;&#x793A;&#x4F8B;&#x56F0;&#x96BE;&#x5F97;&#x591A;&#x3002;&#x6211;&#x5BF9;&#x95ED;&#x5305;&#x548C;&#x5806;&#x6808;&#x6846;&#x67B6;&#x7B49;&#x7684;&#x89E3;&#x91CA;&#x5728;&#x6280;&#x672F;&#x4E0A;&#x662F;&#x4E0D;&#x6B63;&#x786E;&#x7684; - &#x5B83;&#x4EEC;&#x662F;&#x7528;&#x4E8E;&#x5E2E;&#x52A9;&#x7406;&#x89E3;&#x7684;&#x7C97;&#x7565;&#x7B80;&#x5316;&#x3002;&#x4E00;&#x65E6;&#x57FA;&#x672C;&#x7684;&#x60F3;&#x6CD5;&#x662F;grokked&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x63D0;&#x53D6;&#x7EC6;&#x8282;&#x540E;&#x3002;</p>
  380. </blockquote>
  381. <h2 id="&#x603B;&#x7ED3;">&#x603B;&#x7ED3;:</h2>
  382. <blockquote>
  383. <p>1.&#x5F53;&#x4F60;function&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x91CC;&#x9762;&#x4F7F;&#x7528;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;&#x95ED;&#x5305;&#x3002;</p>
  384. <p>2.&#x6BCF;&#x5F53;&#x5728;&#x51FD;&#x6570;&#x4E2D;&#x4F7F;&#x7528;eval&#xFF08;&#xFF09;&#x65F6;&#xFF0C;&#x90FD;&#x4F1A;&#x4F7F;&#x7528;&#x95ED;&#x5305;&#x3002; eval&#x7684;&#x6587;&#x672C;&#x53EF;&#x4EE5;&#x5F15;&#x7528;&#x51FD;&#x6570;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#xFF0C;&#x5728;eval&#x4E2D;&#x751A;&#x81F3;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;eval&#xFF08;&apos;var foo = ...&apos;&#xFF09;&#x521B;&#x5EFA;&#x65B0;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;</p>
  385. <p>3.&#x5F53;&#x5728;&#x51FD;&#x6570;&#x4E2D;&#x4F7F;&#x7528;&#x65B0;&#x7684;Function&#xFF08;...&#xFF09;&#xFF08;Function&#x6784;&#x9020;&#x51FD;&#x6570;&#xFF09;&#x65F6;&#xFF0C;&#x5B83;&#x4E0D;&#x4F1A;&#x521B;&#x5EFA;&#x95ED;&#x5305;&#x3002; &#xFF08;&#x65B0;&#x51FD;&#x6570;&#x4E0D;&#x80FD;&#x5F15;&#x7528;&#x5916;&#x5C42;&#x51FD;&#x6570;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x3002;&#xFF09;</p>
  386. <p>4.JavaScript&#x4E2D;&#x7684;&#x95ED;&#x5305;&#x5C31;&#x50CF;&#x4FDD;&#x7559;&#x6240;&#x6709;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x7684;&#x526F;&#x672C;&#xFF0C;&#x5C31;&#x50CF;&#x51FD;&#x6570;&#x9000;&#x51FA;&#x65F6;&#x4E00;&#x6837;&#x3002;</p>
  387. <p>5.&#x6700;&#x597D;&#x662F;&#x8BA4;&#x4E3A;&#x95ED;&#x5305;&#x59CB;&#x7EC8;&#x53EA;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x7684;&#x5165;&#x53E3;&#xFF0C;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#x5C06;&#x6DFB;&#x52A0;&#x5230;&#x95ED;&#x5305;&#x4E2D;&#x3002;</p>
  388. <p>6.&#x6BCF;&#x6B21;&#x8C03;&#x7528;&#x5177;&#x6709;&#x95ED;&#x5305;&#x7684;&#x51FD;&#x6570;&#x65F6;&#xFF0C;&#x90FD;&#x4F1A;&#x4FDD;&#x5B58;&#x4E00;&#x7EC4;&#x65B0;&#x7684;&#x5C40;&#x90E8;&#x53D8;&#x91CF;&#xFF08;&#x5047;&#x5B9A;&#x51FD;&#x6570;&#x5728;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x51FD;&#x6570;&#x58F0;&#x660E;&#xFF0C;&#x5E76;&#x4E14;&#x5BF9;&#x8BE5;&#x51FD;&#x6570;&#x7684;&#x5F15;&#x7528;&#x8981;&#x4E48;&#x8FD4;&#x56DE;&#xFF0C;&#x8981;&#x4E48;&#x4EE5;&#x67D0;&#x79CD;&#x65B9;&#x5F0F;&#x4FDD;&#x7559;&#x5916;&#x90E8;&#x5F15;&#x7528; &#xFF09;&#x3002;</p>
  389. <p>7.&#x4E24;&#x4E2A;&#x51FD;&#x6570;&#x53EF;&#x80FD;&#x770B;&#x8D77;&#x6765;&#x50CF;&#x5B83;&#x4EEC;&#x5177;&#x6709;&#x76F8;&#x540C;&#x7684;&#x6E90;&#x6587;&#x672C;&#xFF0C;&#x4F46;&#x662F;&#x5177;&#x6709;&#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x7684;&#x884C;&#x4E3A;&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x4EEC;&#x7684;&#x201C;&#x9690;&#x85CF;&#x201D;&#x95ED;&#x5305;&#x3002; &#x6211;&#x4E0D;&#x8BA4;&#x4E3A;JavaScript&#x4EE3;&#x7801;&#x5B9E;&#x9645;&#x4E0A;&#x53EF;&#x4EE5;&#x627E;&#x51FA;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x5F15;&#x7528;&#x662F;&#x5426;&#x6709;&#x95ED;&#x5305;&#x3002;</p>
  390. <p>8.&#x5982;&#x679C;&#x4F60;&#x8BD5;&#x56FE;&#x505A;&#x4EFB;&#x4F55;&#x52A8;&#x6001;&#x6E90;&#x4EE3;&#x7801;&#x4FEE;&#x6539;&#xFF08;&#x4F8B;&#x5982;&#xFF1A;myFunction = Function&#xFF08;myFunction.toString&#xFF08;&#xFF09;&#x3002;replace&#xFF08;/ Hello /&#xFF0C;&apos;Hola&apos;&#xFF09;&#xFF09;;&#xFF09;&#xFF0C;&#x5982;&#x679C;myFunction&#x662F;&#x4E00;&#x4E2A;&#x95ED;&#x5305; &#x5F53;&#x7136;&#xFF0C;&#x4F60;&#x6C38;&#x8FDC;&#x4E0D;&#x4F1A;&#x60F3;&#x5230;&#x5728;&#x8FD0;&#x884C;&#x65F6;&#x505A;&#x6E90;&#x4EE3;&#x7801;&#x5B57;&#x7B26;&#x4E32;&#x66FF;&#x6362;&#xFF0C;&#x4F46;...&#xFF09;&#x3002;</p>
  391. <p>9.&#x53EF;&#x4EE5;&#x5728;&#x51FD;&#x6570;&#x5185;&#x7684;&#x51FD;&#x6570;&#x58F0;&#x660E;&#x4E2D;&#x83B7;&#x5F97;&#x51FD;&#x6570;&#x58F0;&#x660E; - &#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x591A;&#x4E2A;&#x7EA7;&#x522B;&#x83B7;&#x5F97;&#x95ED;&#x5305;&#x3002;</p>
  392. <p>10.&#x6211;&#x8BA4;&#x4E3A;&#x901A;&#x5E38;&#x95ED;&#x5305;&#x662F;&#x51FD;&#x6570;&#x548C;&#x6355;&#x83B7;&#x7684;&#x53D8;&#x91CF;&#x7684;&#x672F;&#x8BED;&#x3002; &#x6CE8;&#x610F;&#xFF0C;&#x6211;&#x5728;&#x672C;&#x6587;&#x4E2D;&#x4E0D;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x5B9A;&#x4E49;&#xFF01;</p>
  393. <p>11.&#x6211;&#x6000;&#x7591;JavaScript&#x4E2D;&#x7684;&#x95ED;&#x5305;&#x4E0D;&#x540C;&#x4E8E;&#x901A;&#x5E38;&#x5728;&#x51FD;&#x6570;&#x5F0F;&#x8BED;&#x8A00;&#x4E2D;&#x53D1;&#x73B0;&#x7684;&#x95ED;&#x5305;&#x3002;</p>
  394. </blockquote>
  395. <h2 id="&#x94FE;&#x63A5;">&#x94FE;&#x63A5;:</h2>
  396. <blockquote>
  397. <p>1.Douglas Crockford&#x7684;&#x6A21;&#x62DF;<a href="http://www.crockford.com/javascript/private.html" target="_blank">&#x79C1;&#x6709;&#x5C5E;&#x6027;&#x548C;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x7684;&#x79C1;&#x6709;&#x65B9;&#x6CD5;</a>&#xFF0C;&#x4F7F;&#x7528;&#x95ED;&#x5305;&#x3002;</p>
  398. <p>2.&#x4E00;&#x4E2A;&#x4F1F;&#x5927;&#x7684;&#x89E3;&#x91CA;&#x5982;&#x4F55;&#x95ED;&#x5305;&#x53EF;&#x4EE5;&#x5BFC;&#x81F4;<a href="https://www.codeproject.com/Articles/12231/Memory-Leakage-in-Internet-Explorer-revisited" target="_blank">&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#x5728;IE</a>&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x5C0F;&#x5FC3;&#x3002;</p>
  399. </blockquote>
  400. <h2 id="&#x611F;&#x8C22;">&#x611F;&#x8C22;</h2>
  401. <blockquote>
  402. <p>&#x5982;&#x679C;&#x4F60;&#x521A;&#x521A;&#x5B66;&#x5230;&#x4E86;&#x95ED;&#x5305;&#xFF08;&#x5728;&#x8FD9;&#x91CC;&#x6216;&#x5176;&#x4ED6;&#x5730;&#x65B9;&#xFF01;&#xFF09;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x6709;&#x5174;&#x8DA3;&#x4EFB;&#x4F55;&#x53CD;&#x9988;&#x4ECE;&#x60A8;&#x7684;&#x4EFB;&#x4F55;&#x66F4;&#x6539;&#xFF0C;&#x4F60;&#x53EF;&#x80FD;&#x5EFA;&#x8BAE;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x672C;&#x6587;&#x66F4;&#x6E05;&#x695A;&#x3002; &#x53D1;&#x9001;&#x7535;&#x5B50;&#x90AE;&#x4EF6;&#x81F3;morrisjohns.com&#xFF08;morris_closure @&#xFF09;&#x3002; &#x8BF7;&#x6CE8;&#x610F;&#xFF0C;&#x6211;&#x4E0D;&#x662F;JavaScript&#x7684;&#x4E0A;&#x5E08; - &#x4E5F;&#x4E0D;&#x662F;&#x5173;&#x95ED;&#x3002;</p>
  403. </blockquote>
  404. </div>
  405. <hr>
  406. <div class="btn-group btn-group-justified">
  407. <a class="btn" href="02.html"><b>上一页:</b> 闭包</a>
  408. <a class="btn" href="04.html"><b>下一页:</b> 匿名函数和闭包</a>
  409. </div>
  410. </div>
  411. <div class="search-results">
  412. <div class="has-results">
  413. <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
  414. <ul class="search-results-list"></ul>
  415. </div>
  416. <div class="no-results">
  417. <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
  418. </div>
  419. </div>
  420. </div>
  421. </div>
  422. </div>
  423. </div>
  424. </div>
  425. </div>
  426. <footer class="gb-page-footer">
  427. <div class="container">
  428. <ul class="menu">
  429. <li class="pull-right">
  430. <span class="service-info">Copyright GitBook 2018</span>
  431. </li>
  432. <li>
  433. <a href="#">Return to the top</a>
  434. </li>
  435. <li>
  436. <a href="#">Updated May 30th 18</a>
  437. </li>
  438. </ul>
  439. </div>
  440. </footer>
  441. </div>
  442. <script src="../../gitbook/gitbook.js"></script>
  443. <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
  444. <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
  445. <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
  446. <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
  447. <script>
  448. (function() {
  449. gitbook.page.hasChanged({"page":{"title":"写给初级JS程序员的JavaScript闭包(译)","level":"2.1.6","depth":2,"next":{"title":"匿名函数和闭包","level":"2.1.7","depth":2,"path":"JavaScript/principle/04.md","ref":"JavaScript/principle/04.md","articles":[]},"previous":{"title":"闭包","level":"2.1.5","depth":2,"path":"JavaScript/principle/02.md","ref":"JavaScript/principle/02.md","articles":[]},"dir":"ltr"},"config":{"plugins":["theme-official@2.1.1","-sharing","-fontsettings","sitemap","-search","search-pro"],"root":"./docs/","styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"sitemap":{"hostname":"https://blog.honghaitao.net/"},"search-pro":{"cutWordLib":"nodejieba","defineWord":["小需求","基础建设"]},"highlight":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"theme-official":{},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{"version":"0.0.1"},"title":"代码收集","gitbook":"3.1.1"},"file":{"path":"JavaScript/principle/03.md","mtime":"2018-05-30T08:23:34.364Z","type":"markdown"},"gitbook":{"version":"3.1.1","time":"2018-05-31T08:39:58.544Z"},"basePath":"../..","book":{"language":""}});
  450. })();
  451. </script>
  452. </body>
  453. </html>