03.html 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  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. </div>
  169. </div>
  170. <div class="panel panel-default">
  171. <div class="panel-heading">
  172. <h3 class="panel-title">GIT</h3>
  173. </div>
  174. <div class="list-group">
  175. <a href="../../git/git.html" class="list-group-item ">
  176. git 命令
  177. </a>
  178. </div>
  179. </div>
  180. <div class="panel panel-default">
  181. <div class="list-group">
  182. <a href="../../other/faq.html" class="list-group-item ">
  183. FAQ
  184. </a>
  185. <a href="../../other/examples.html" class="list-group-item ">
  186. Examples
  187. </a>
  188. </div>
  189. </div>
  190. </div>
  191. <div class="col-md-9">
  192. <div id="book-search-results">
  193. <div class="search-noresults">
  194. <div class="gb-markdown book-page-inner">
  195. <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>
  196. <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>
  197. <h1 id="&#x95ED;&#x5305;&#x4E0D;&#x662F;&#x9B54;&#x672F;">&#x95ED;&#x5305;&#x4E0D;&#x662F;&#x9B54;&#x672F;</h1>
  198. <blockquote>
  199. <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;
  200. &#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;
  201. &#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>
  202. <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>{
  203. <span class="hljs-keyword">var</span> text = <span class="hljs-string">&apos;Hello &apos;</span> + name;
  204. <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); }
  205. say();
  206. }
  207. sayHello(<span class="hljs-string">&apos;Joe&apos;</span>);
  208. </code></pre>
  209. </blockquote>
  210. <h3 id="&#x95ED;&#x5305;&#x7684;&#x5B9E;&#x4F8B;">&#x95ED;&#x5305;&#x7684;&#x5B9E;&#x4F8B;</h3>
  211. <blockquote>
  212. <p>&#x4E24;&#x53E5;&#x8BDD;&#x6458;&#x8981;&#xFF1A;<br></p>
  213. <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>
  214. <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>
  215. </blockquote>
  216. <p>&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x8FD4;&#x56DE;&#x5BF9;&#x51FD;&#x6570;&#x7684;&#x5F15;&#x7528;&#xFF1A;</p>
  217. <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>{
  218. <span class="hljs-keyword">var</span> text = <span class="hljs-string">&apos;Hello &apos;</span> + name; <span class="hljs-comment">// Local variable</span>
  219. <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); }
  220. <span class="hljs-keyword">return</span> say;
  221. }
  222. <span class="hljs-keyword">var</span> say2 = sayHello2(<span class="hljs-string">&apos;Bob&apos;</span>);
  223. say2(); <span class="hljs-comment">// logs &quot;Hello Bob&quot;</span>
  224. </code></pre>
  225. <blockquote>
  226. <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>
  227. <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>
  228. <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>
  229. <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>
  230. <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>
  231. </blockquote>
  232. <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>
  233. </code></pre>
  234. <blockquote>
  235. <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>
  236. <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>
  237. </blockquote>
  238. <hr>
  239. <h1 id="&#x66F4;&#x591A;&#x4F8B;&#x5B50;">&#x66F4;&#x591A;&#x4F8B;&#x5B50;</h1>
  240. <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>
  241. <h3 id="&#x4F8B;3">&#x4F8B;3</h3>
  242. <blockquote>
  243. <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>
  244. </blockquote>
  245. <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>{
  246. <span class="hljs-comment">// Local variable that ends up within closure</span>
  247. <span class="hljs-keyword">var</span> num = <span class="hljs-number">42</span>;
  248. <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); }
  249. num++;
  250. <span class="hljs-keyword">return</span> say;
  251. }
  252. <span class="hljs-keyword">var</span> sayNumber = say667();
  253. sayNumber(); <span class="hljs-comment">// logs 43</span>
  254. </code></pre>
  255. <h3 id="&#x4F8B;4">&#x4F8B;4</h3>
  256. <blockquote>
  257. <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>
  258. </blockquote>
  259. <pre><code class="lang-js"><span class="hljs-keyword">var</span> gLogNumber, gIncreaseNumber, gSetNumber;
  260. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setupSomeGlobals</span>(<span class="hljs-params"></span>) </span>{
  261. <span class="hljs-comment">// Local variable that ends up within closure</span>
  262. <span class="hljs-keyword">var</span> num = <span class="hljs-number">42</span>;
  263. <span class="hljs-comment">// Store some references to functions as global variables</span>
  264. 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); }
  265. gIncreaseNumber = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ num++; }
  266. gSetNumber = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>) </span>{ num = x; }
  267. }
  268. setupSomeGlobals();
  269. gIncreaseNumber();
  270. gLogNumber(); <span class="hljs-comment">// 43</span>
  271. gSetNumber(<span class="hljs-number">5</span>);
  272. gLogNumber(); <span class="hljs-comment">// 5</span>
  273. <span class="hljs-keyword">var</span> oldLog = gLogNumber;
  274. setupSomeGlobals();
  275. gLogNumber(); <span class="hljs-comment">// 42</span>
  276. oldLog() <span class="hljs-comment">// 5</span>
  277. </code></pre>
  278. <blockquote>
  279. <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>
  280. &#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>
  281. </blockquote>
  282. <h3 id="&#x4F8B;5">&#x4F8B;5</h3>
  283. <blockquote>
  284. <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>
  285. </blockquote>
  286. <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>{
  287. <span class="hljs-keyword">var</span> result = [];
  288. <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; list.length; i++) {
  289. <span class="hljs-keyword">var</span> item = <span class="hljs-string">&apos;item&apos;</span> + i;
  290. 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])} );
  291. }
  292. <span class="hljs-keyword">return</span> result;
  293. }
  294. <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">testList</span>(<span class="hljs-params"></span>) </span>{
  295. <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>]);
  296. <span class="hljs-comment">// Using j only to help prevent confusion -- could use i.</span>
  297. <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> j = <span class="hljs-number">0</span>; j &lt; fnlist.length; j++) {
  298. fnlist[j]();
  299. }
  300. }
  301. testList() <span class="hljs-comment">//logs &quot;item2 undefined&quot; 3 times</span>
  302. </code></pre>
  303. <blockquote>
  304. <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>
  305. </blockquote>
  306. <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])};
  307. result.push(pointer);
  308. </code></pre>
  309. <blockquote>
  310. <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>
  311. </blockquote>
  312. <h3 id="&#x4F8B;6">&#x4F8B;6</h3>
  313. <blockquote>
  314. <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>
  315. </blockquote>
  316. <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>{
  317. <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); }
  318. <span class="hljs-comment">// Local variable that ends up within closure</span>
  319. <span class="hljs-keyword">var</span> alice = <span class="hljs-string">&apos;Hello Alice&apos;</span>;
  320. <span class="hljs-keyword">return</span> say;
  321. }
  322. sayAlice()();<span class="hljs-comment">// logs &quot;Hello Alice&quot;</span>
  323. </code></pre>
  324. <blockquote>
  325. <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>
  326. </blockquote>
  327. <h3 id="&#x4F8B;7">&#x4F8B;7</h3>
  328. <blockquote>
  329. <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>
  330. </blockquote>
  331. <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>{
  332. <span class="hljs-comment">// Local variables that end up within closure</span>
  333. <span class="hljs-keyword">var</span> num = someNum;
  334. <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>];
  335. <span class="hljs-keyword">var</span> ref = someRef;
  336. <span class="hljs-keyword">return</span> <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>) </span>{
  337. num += x;
  338. anArray.push(num);
  339. <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&apos;num: &apos;</span> + num +
  340. <span class="hljs-string">&apos;; anArray: &apos;</span> + anArray.toString() +
  341. <span class="hljs-string">&apos;; ref.someVar: &apos;</span> + ref.someVar + <span class="hljs-string">&apos;;&apos;</span>);
  342. }
  343. }
  344. obj = {someVar: <span class="hljs-number">4</span>};
  345. fn1 = newClosure(<span class="hljs-number">4</span>, obj);
  346. fn2 = newClosure(<span class="hljs-number">5</span>, obj);
  347. fn1(<span class="hljs-number">1</span>); <span class="hljs-comment">// num: 5; anArray: 1,2,3,5; ref.someVar: 4;</span>
  348. fn2(<span class="hljs-number">1</span>); <span class="hljs-comment">// num: 6; anArray: 1,2,3,6; ref.someVar: 4;</span>
  349. obj.someVar++;
  350. fn1(<span class="hljs-number">2</span>); <span class="hljs-comment">// num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;</span>
  351. fn2(<span class="hljs-number">2</span>); <span class="hljs-comment">// num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;</span>
  352. </code></pre>
  353. <hr>
  354. <h2 id="&#x6982;&#x8981;">&#x6982;&#x8981;</h2>
  355. <blockquote>
  356. <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>
  357. </blockquote>
  358. <h2 id="&#x603B;&#x7ED3;">&#x603B;&#x7ED3;:</h2>
  359. <blockquote>
  360. <p>1.&#x5F53;&#x4F60;function&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x91CC;&#x9762;&#x4F7F;&#x7528;&#x65F6;&#xFF0C;&#x4F7F;&#x7528;&#x95ED;&#x5305;&#x3002;</p>
  361. <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>
  362. <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>
  363. <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>
  364. <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>
  365. <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>
  366. <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>
  367. <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>
  368. <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>
  369. <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>
  370. <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>
  371. </blockquote>
  372. <h2 id="&#x94FE;&#x63A5;">&#x94FE;&#x63A5;:</h2>
  373. <blockquote>
  374. <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>
  375. <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>
  376. </blockquote>
  377. <h2 id="&#x611F;&#x8C22;">&#x611F;&#x8C22;</h2>
  378. <blockquote>
  379. <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>
  380. </blockquote>
  381. </div>
  382. <hr>
  383. <div class="btn-group btn-group-justified">
  384. <a class="btn" href="02.html"><b>上一页:</b> 闭包</a>
  385. <a class="btn" href="04.html"><b>下一页:</b> 匿名函数和闭包</a>
  386. </div>
  387. </div>
  388. <div class="search-results">
  389. <div class="has-results">
  390. <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
  391. <ul class="search-results-list"></ul>
  392. </div>
  393. <div class="no-results">
  394. <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
  395. </div>
  396. </div>
  397. </div>
  398. </div>
  399. </div>
  400. </div>
  401. </div>
  402. </div>
  403. <footer class="gb-page-footer">
  404. <div class="container">
  405. <ul class="menu">
  406. <li class="pull-right">
  407. <span class="service-info">Copyright GitBook 2018</span>
  408. </li>
  409. <li>
  410. <a href="#">Return to the top</a>
  411. </li>
  412. <li>
  413. <a href="#">Updated May 30th 18</a>
  414. </li>
  415. </ul>
  416. </div>
  417. </footer>
  418. </div>
  419. <script src="../../gitbook/gitbook.js"></script>
  420. <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
  421. <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
  422. <script src="../../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
  423. <script src="../../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
  424. <script>
  425. (function() {
  426. 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-30T08:29:33.556Z"},"basePath":"../..","book":{"language":""}});
  427. })();
  428. </script>
  429. </body>
  430. </html>