2018_11_02_03.html 83 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <!DOCTYPE html>
  2. <html lang="en-US">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <title>匿名函数和闭包 | 看白鹿的博客</title>
  7. <meta name="description" content="只有敢于尝试,才能品味人生.">
  8. <link rel="icon" href="/logo.png">
  9. <link rel="preload" href="/assets/css/0.styles.085a33b3.css" as="style"><link rel="preload" href="/assets/js/app.6fdf7a1a.js" as="script"><link rel="preload" href="/assets/js/3.d927fe3f.js" as="script"><link rel="preload" href="/assets/js/89.9d32b063.js" as="script"><link rel="prefetch" href="/assets/js/10.ddd49d9f.js"><link rel="prefetch" href="/assets/js/100.62640b93.js"><link rel="prefetch" href="/assets/js/101.c8cf9c2d.js"><link rel="prefetch" href="/assets/js/102.002e609f.js"><link rel="prefetch" href="/assets/js/103.33efbaf6.js"><link rel="prefetch" href="/assets/js/104.9fdf3298.js"><link rel="prefetch" href="/assets/js/105.b80b4908.js"><link rel="prefetch" href="/assets/js/106.a0d0c126.js"><link rel="prefetch" href="/assets/js/107.9e4690cd.js"><link rel="prefetch" href="/assets/js/108.b26f8cda.js"><link rel="prefetch" href="/assets/js/109.aab82647.js"><link rel="prefetch" href="/assets/js/11.031f5987.js"><link rel="prefetch" href="/assets/js/110.fbc1b463.js"><link rel="prefetch" href="/assets/js/111.8d5115fe.js"><link rel="prefetch" href="/assets/js/112.1dc7c881.js"><link rel="prefetch" href="/assets/js/113.e98045fa.js"><link rel="prefetch" href="/assets/js/114.ec80549c.js"><link rel="prefetch" href="/assets/js/115.bba179d7.js"><link rel="prefetch" href="/assets/js/116.87a757cd.js"><link rel="prefetch" href="/assets/js/117.364a4760.js"><link rel="prefetch" href="/assets/js/118.bd293cf4.js"><link rel="prefetch" href="/assets/js/119.03946716.js"><link rel="prefetch" href="/assets/js/12.c5ff764f.js"><link rel="prefetch" href="/assets/js/13.69975414.js"><link rel="prefetch" href="/assets/js/14.1619fdb3.js"><link rel="prefetch" href="/assets/js/15.9e237ec5.js"><link rel="prefetch" href="/assets/js/16.a73badee.js"><link rel="prefetch" href="/assets/js/17.0b109a58.js"><link rel="prefetch" href="/assets/js/18.bcafe2ac.js"><link rel="prefetch" href="/assets/js/19.ea9061ed.js"><link rel="prefetch" href="/assets/js/20.87589e25.js"><link rel="prefetch" href="/assets/js/21.8976c280.js"><link rel="prefetch" href="/assets/js/22.36113299.js"><link rel="prefetch" href="/assets/js/23.9fff152f.js"><link rel="prefetch" href="/assets/js/24.dd9701a5.js"><link rel="prefetch" href="/assets/js/25.407b9d73.js"><link rel="prefetch" href="/assets/js/26.11609a9f.js"><link rel="prefetch" href="/assets/js/27.735b1444.js"><link rel="prefetch" href="/assets/js/28.3e289e6e.js"><link rel="prefetch" href="/assets/js/29.98df1858.js"><link rel="prefetch" href="/assets/js/30.3984473c.js"><link rel="prefetch" href="/assets/js/31.a0f2300e.js"><link rel="prefetch" href="/assets/js/32.d40cdab2.js"><link rel="prefetch" href="/assets/js/33.e1afcf45.js"><link rel="prefetch" href="/assets/js/34.2da6ccab.js"><link rel="prefetch" href="/assets/js/35.6d2010cc.js"><link rel="prefetch" href="/assets/js/36.fcb134e9.js"><link rel="prefetch" href="/assets/js/37.19d87fca.js"><link rel="prefetch" href="/assets/js/38.867c7402.js"><link rel="prefetch" href="/assets/js/39.1c684a15.js"><link rel="prefetch" href="/assets/js/4.ae3881f6.js"><link rel="prefetch" href="/assets/js/40.6739a691.js"><link rel="prefetch" href="/assets/js/41.62268f83.js"><link rel="prefetch" href="/assets/js/42.6a42cae0.js"><link rel="prefetch" href="/assets/js/43.96f9b56c.js"><link rel="prefetch" href="/assets/js/44.de29fc31.js"><link rel="prefetch" href="/assets/js/45.b827bf31.js"><link rel="prefetch" href="/assets/js/46.d396acf1.js"><link rel="prefetch" href="/assets/js/47.1ac1f013.js"><link rel="prefetch" href="/assets/js/48.641f65ec.js"><link rel="prefetch" href="/assets/js/49.bba862e8.js"><link rel="prefetch" href="/assets/js/5.cdbf7455.js"><link rel="prefetch" href="/assets/js/50.36aee47e.js"><link rel="prefetch" href="/assets/js/51.473395d7.js"><link rel="prefetch" href="/assets/js/52.c37a3a9e.js"><link rel="prefetch" href="/assets/js/53.d032f8db.js"><link rel="prefetch" href="/assets/js/54.80d9ca6b.js"><link rel="prefetch" href="/assets/js/55.e9e747b1.js"><link rel="prefetch" href="/assets/js/56.c739c496.js"><link rel="prefetch" href="/assets/js/57.6f365715.js"><link rel="prefetch" href="/assets/js/58.871b6c90.js"><link rel="prefetch" href="/assets/js/59.bfe555b8.js"><link rel="prefetch" href="/assets/js/6.8d2d716e.js"><link rel="prefetch" href="/assets/js/60.c7a0f2fa.js"><link rel="prefetch" href="/assets/js/61.78286769.js"><link rel="prefetch" href="/assets/js/62.7bf4a98a.js"><link rel="prefetch" href="/assets/js/63.903bf427.js"><link rel="prefetch" href="/assets/js/64.2f9e3d98.js"><link rel="prefetch" href="/assets/js/65.8748ec4f.js"><link rel="prefetch" href="/assets/js/66.2a60bc9d.js"><link rel="prefetch" href="/assets/js/67.a047e4a2.js"><link rel="prefetch" href="/assets/js/68.d1b501c2.js"><link rel="prefetch" href="/assets/js/69.8e88b367.js"><link rel="prefetch" href="/assets/js/7.4a26cc5b.js"><link rel="prefetch" href="/assets/js/70.77ff76ce.js"><link rel="prefetch" href="/assets/js/71.82881d5c.js"><link rel="prefetch" href="/assets/js/72.bbc73b16.js"><link rel="prefetch" href="/assets/js/73.7e284f13.js"><link rel="prefetch" href="/assets/js/74.35b51c68.js"><link rel="prefetch" href="/assets/js/75.fe036eaa.js"><link rel="prefetch" href="/assets/js/76.a8ba1657.js"><link rel="prefetch" href="/assets/js/77.599112bf.js"><link rel="prefetch" href="/assets/js/78.11bef8e9.js"><link rel="prefetch" href="/assets/js/79.990c1548.js"><link rel="prefetch" href="/assets/js/8.c2f0bf16.js"><link rel="prefetch" href="/assets/js/80.e889bc7c.js"><link rel="prefetch" href="/assets/js/81.2cc6a3c7.js"><link rel="prefetch" href="/assets/js/82.50d1bd4a.js"><link rel="prefetch" href="/assets/js/83.bc44a308.js"><link rel="prefetch" href="/assets/js/84.e233c4ac.js"><link rel="prefetch" href="/assets/js/85.c322a56a.js"><link rel="prefetch" href="/assets/js/86.afef70cd.js"><link rel="prefetch" href="/assets/js/87.4dfc8ea6.js"><link rel="prefetch" href="/assets/js/88.b0778008.js"><link rel="prefetch" href="/assets/js/9.2eef732d.js"><link rel="prefetch" href="/assets/js/90.964433f3.js"><link rel="prefetch" href="/assets/js/91.f3a29d8d.js"><link rel="prefetch" href="/assets/js/92.9f5f6d07.js"><link rel="prefetch" href="/assets/js/93.c39446ef.js"><link rel="prefetch" href="/assets/js/94.c404c775.js"><link rel="prefetch" href="/assets/js/95.e66ccec2.js"><link rel="prefetch" href="/assets/js/96.6cfb5c07.js"><link rel="prefetch" href="/assets/js/97.4369b840.js"><link rel="prefetch" href="/assets/js/98.da5a7845.js"><link rel="prefetch" href="/assets/js/99.c99e6075.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.f9add12f.js">
  10. <link rel="stylesheet" href="/assets/css/0.styles.085a33b3.css">
  11. </head>
  12. <body>
  13. <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">看白鹿的博客</span></a> <div class="links"><form id="search-form" role="search" class="algolia-search-wrapper search-box"><input id="algolia-search-input" class="search-query"></form> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端" class="dropdown-title"><span class="title">前端</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/CSS/" class="nav-link">CSS</a></li><li class="dropdown-item"><!----> <a href="/FLUTTER/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/GIT/" class="nav-link">GIT</a></li><li class="dropdown-item"><!----> <a href="/JavaScript/" class="nav-link router-link-active">JavaScript</a></li><li class="dropdown-item"><!----> <a href="/REACT/" class="nav-link">react</a></li><li class="dropdown-item"><!----> <a href="/VUE/" class="nav-link">vue</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="后台" class="dropdown-title"><span class="title">后台</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/NODE/" class="nav-link">node</a></li><li class="dropdown-item"><!----> <a href="/UBUNTU/" class="nav-link">ubuntu</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其他" class="dropdown-title"><span class="title">其他</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/IDE/" class="nav-link">IDE</a></li><li class="dropdown-item"><!----> <a href="/About/WHY.html" class="nav-link">待了解</a></li><li class="dropdown-item"><!----> <a href="/INTERVIEW/" class="nav-link">面试</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/Johnhong9527" target="_blank" rel="noopener noreferrer" class="nav-link external">
  14. GitHub
  15. <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="前端" class="dropdown-title"><span class="title">前端</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/CSS/" class="nav-link">CSS</a></li><li class="dropdown-item"><!----> <a href="/FLUTTER/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/GIT/" class="nav-link">GIT</a></li><li class="dropdown-item"><!----> <a href="/JavaScript/" class="nav-link router-link-active">JavaScript</a></li><li class="dropdown-item"><!----> <a href="/REACT/" class="nav-link">react</a></li><li class="dropdown-item"><!----> <a href="/VUE/" class="nav-link">vue</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="后台" class="dropdown-title"><span class="title">后台</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/NODE/" class="nav-link">node</a></li><li class="dropdown-item"><!----> <a href="/UBUNTU/" class="nav-link">ubuntu</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="其他" class="dropdown-title"><span class="title">其他</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/IDE/" class="nav-link">IDE</a></li><li class="dropdown-item"><!----> <a href="/About/WHY.html" class="nav-link">待了解</a></li><li class="dropdown-item"><!----> <a href="/INTERVIEW/" class="nav-link">面试</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/Johnhong9527" target="_blank" rel="noopener noreferrer" class="nav-link external">
  16. GitHub
  17. <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav> <ul class="sidebar-links"><li><a href="/JavaScript/" class="sidebar-link">JS 目录</a></li><li><a href="/JavaScript/2018_10_29_02.html" class="sidebar-link">代码收集</a></li><li><a href="/JavaScript/2018_10_28_01.html" class="sidebar-link">动态替换图片</a></li><li><a href="/JavaScript/2018_11_02_01.html" class="sidebar-link">战舰游戏</a></li><li><a href="/JavaScript/2018_11_02_02.html" class="sidebar-link">原理</a></li><li><a href="/JavaScript/2018_11_02_03.html" class="active sidebar-link">匿名函数和闭包</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#_1-匿名函数" class="sidebar-link">1.匿名函数</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#_2-闭包" class="sidebar-link">2.闭包</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#通过全局变量来累加" class="sidebar-link">通过全局变量来累加</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#通过闭包可以实现局部变量的累加" class="sidebar-link">通过闭包可以实现局部变量的累加</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#循环里包含匿名函数" class="sidebar-link">循环里包含匿名函数</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#循环里包含匿名函数-改-1,自我执行匿名函数" class="sidebar-link">循环里包含匿名函数-改 1,自我执行匿名函数</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#循环里包含匿名函数-改-2,匿名函数下再做个匿名函" class="sidebar-link">循环里包含匿名函数-改 2,匿名函数下再做个匿名函</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#内存泄漏" class="sidebar-link">内存泄漏</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#模仿块级作用域-私有作用域" class="sidebar-link">模仿块级作用域(私有作用域)</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#可以通过构造方法传参来访问私有变量" class="sidebar-link">可以通过构造方法传参来访问私有变量</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_03.html#私有化变量和函数" class="sidebar-link">私有化变量和函数</a></li></ul></li></ul></li><li><a href="/JavaScript/2018_11_02_04.html" class="sidebar-link">instanceof运算符</a></li><li><a href="/JavaScript/2018_11_02_05.html" class="sidebar-link">JavaScript 事件流</a></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="匿名函数和闭包"><a href="#匿名函数和闭包" class="header-anchor">#</a> 匿名函数和闭包</h1> <p>在计算机科学中,闭包是函数的非局部变量(自由变量)的引用环境。</p> <p>包含自由变量的函数与为所有这些自由变量提供了变量绑定的环境一起,被称为闭包。</p> <p>以下内容为学习笔记,来自李炎恢老师的课堂纪要。</p> <h2 id="_1-匿名函数"><a href="#_1-匿名函数" class="header-anchor">#</a> 1.匿名函数</h2> <p>普通函数</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  18. <span class="token comment">//函数名是box</span>
  19. <span class="token keyword">return</span> <span class="token string">'Lee'</span><span class="token punctuation">;</span>
  20. <span class="token punctuation">}</span>
  21. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>匿名函数</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//匿名函数,会报错</span>
  22. <span class="token keyword">return</span> <span class="token string">'Lee'</span><span class="token punctuation">;</span>
  23. <span class="token punctuation">}</span>
  24. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>通过表达式自我执行</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token punctuation">(</span><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  25. <span class="token comment">//封装成表达式</span>
  26. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'Lee'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  27. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//()表示执行函数,并且传参</span>
  28. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>把匿名函数赋值给变量</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> <span class="token function-variable function">box</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  29. <span class="token comment">//将匿名函数赋给变量</span>
  30. <span class="token keyword">return</span> <span class="token string">'Lee'</span><span class="token punctuation">;</span>
  31. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  32. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//调用方式和函数调用相似</span>
  33. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>函数里的匿名函数</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  34. <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  35. <span class="token comment">//函数里的匿名函数,产生闭包</span>
  36. <span class="token keyword">return</span> <span class="token string">'Lee'</span><span class="token punctuation">;</span>
  37. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  38. <span class="token punctuation">}</span>
  39. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//调用匿名函数</span>
  40. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h2 id="_2-闭包"><a href="#_2-闭包" class="header-anchor">#</a> 2.闭包</h2> <p>闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在</p> <p>一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。</p> <p>通过闭包可以返回局部变量</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  41. <span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token string">'Lee'</span><span class="token punctuation">;</span>
  42. <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  43. <span class="token comment">//通过匿名函数返回box()局部变量</span>
  44. <span class="token keyword">return</span> user<span class="token punctuation">;</span>
  45. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  46. <span class="token punctuation">}</span>
  47. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//通过box()()来直接调用匿名函数返回值</span>
  48. <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  49. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">b</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//另一种调用匿名函数返回值</span>
  50. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><p>使用闭包有一个优点,也是它的缺点:就是可以把局部变量驻留在内存中,可以避免使</p> <p>用全局变量。(全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难,</p> <p>所以推荐使用私有的,封装的局部变量)。</p> <h3 id="通过全局变量来累加"><a href="#通过全局变量来累加" class="header-anchor">#</a> 通过全局变量来累加</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token comment">//全局变量</span>
  51. <span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  52. age<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">//模块级可以调用全局变量,进行累加</span>
  53. <span class="token punctuation">}</span>
  54. <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//执行函数,累加了</span>
  55. <span class="token function">alert</span><span class="token punctuation">(</span>age<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//输出全局变量</span>
  56. <span class="token comment">//通过局部变量无法实现累加</span>
  57. <span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  58. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
  59. age<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token comment">//累加</span>
  60. <span class="token keyword">return</span> age<span class="token punctuation">;</span>
  61. <span class="token punctuation">}</span>
  62. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//101</span>
  63. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//101,无法实现,因为又被初始化了</span>
  64. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><h3 id="通过闭包可以实现局部变量的累加"><a href="#通过闭包可以实现局部变量的累加" class="header-anchor">#</a> 通过闭包可以实现局部变量的累加</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  65. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
  66. <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  67. age<span class="token operator">++</span><span class="token punctuation">;</span>
  68. <span class="token keyword">return</span> age<span class="token punctuation">;</span>
  69. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  70. <span class="token punctuation">}</span>
  71. <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获得函数</span>
  72. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">b</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//调用匿名函数</span>
  73. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">b</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//第二次调用匿名函数,实现累加</span>
  74. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><h3 id="循环里包含匿名函数"><a href="#循环里包含匿名函数" class="header-anchor">#</a> 循环里包含匿名函数</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  75. <span class="token keyword">var</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  76. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  77. arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  78. <span class="token keyword">return</span> i<span class="token punctuation">;</span>
  79. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  80. <span class="token punctuation">}</span>
  81. <span class="token keyword">return</span> arr<span class="token punctuation">;</span>
  82. <span class="token punctuation">}</span>
  83. <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//得到函数数组</span>
  84. <span class="token function">alert</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//得到函数集合长度</span>
  85. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> b<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  86. <span class="token function">alert</span><span class="token punctuation">(</span>b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//输出每个函数的值,都是最后一个值</span>
  87. <span class="token punctuation">}</span>
  88. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>上面的例子输出的结果都是 5,也就是循环后得到的最大的 i 值。因为 b[i]调用的是匿名函数,匿名函数并没有自我执行,等到调用的时候,box()已执行完毕,i 早已变成 5,所以最终的结果就是 5 个 5。</p> <h3 id="循环里包含匿名函数-改-1,自我执行匿名函数"><a href="#循环里包含匿名函数-改-1,自我执行匿名函数" class="header-anchor">#</a> 循环里包含匿名函数-改 1,自我执行匿名函数</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  89. <span class="token keyword">var</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  90. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  91. arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  92. <span class="token comment">//自我执行</span>
  93. <span class="token keyword">return</span> num<span class="token punctuation">;</span>
  94. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//并且传参</span>
  95. <span class="token punctuation">}</span>
  96. <span class="token keyword">return</span> arr<span class="token punctuation">;</span>
  97. <span class="token punctuation">}</span>
  98. <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  99. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> b<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  100. <span class="token function">alert</span><span class="token punctuation">(</span>b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//这里返回的是数组,直接打印即可</span>
  101. <span class="token punctuation">}</span>
  102. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>改 1 中,我们让匿名函数进行自我执行,导致最终返回给 a[i]的是数组而不是函数了。</p> <p>最终导致 b[0]-b[4]中保留了 0,1,2,3,4 的值。</p> <h3 id="循环里包含匿名函数-改-2,匿名函数下再做个匿名函"><a href="#循环里包含匿名函数-改-2,匿名函数下再做个匿名函" class="header-anchor">#</a> 循环里包含匿名函数-改 2,匿名函数下再做个匿名函</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  103. <span class="token keyword">var</span> arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  104. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">5</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  105. arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">num</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  106. <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  107. <span class="token comment">//直接返回值,改2 变成返回函数</span>
  108. <span class="token keyword">return</span> num<span class="token punctuation">;</span> <span class="token comment">//原理和改1 一样</span>
  109. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  110. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
  111. <span class="token punctuation">}</span>
  112. <span class="token keyword">return</span> arr<span class="token punctuation">;</span>
  113. <span class="token punctuation">}</span>
  114. <span class="token keyword">var</span> b <span class="token operator">=</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  115. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> b<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  116. <span class="token function">alert</span><span class="token punctuation">(</span>b<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//这里通过b[i]()函数调用即可</span>
  117. <span class="token punctuation">}</span>
  118. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><p>改 1 和改 2 中,我们通过匿名函数自我执行,立即把结果赋值给 a[i]。每一个 i,是调用方通过按值传递的,所以最终返回的都是指定的递增的 i。而不是 box()函数里的 i。</p> <p>关于 this 对象在闭包中使用 this 对象也可能会导致一些问题,this 对象是在运行时基于函数的执行环境绑定的,如果 this 在全局范围就是 window,如果在对象内部就指向这个对象。</p> <p>而闭包却在运行时指向 window 的,因为闭包并不属于这个对象的属性或方法。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token string">'The Window'</span><span class="token punctuation">;</span>
  119. <span class="token keyword">var</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span>
  120. user <span class="token operator">:</span> <span class="token string">'The Object'</span><span class="token punctuation">,</span>
  121. <span class="token function-variable function">getUserFunction</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  122. <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//闭包不属于obj,里面的this 指向window</span>
  123. <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>user<span class="token punctuation">;</span>
  124. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  125. <span class="token punctuation">}</span>
  126. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  127. <span class="token function">alert</span><span class="token punctuation">(</span>obj<span class="token punctuation">.</span><span class="token function">getUserFunction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//The window</span>
  128. <span class="token comment">//可以强制指向某个对象</span>
  129. <span class="token function">alert</span><span class="token punctuation">(</span>obj<span class="token punctuation">.</span><span class="token function">getUserFunction</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>obj<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//The Object</span>
  130. <span class="token comment">//也可以从上一个作用域中得到对象</span>
  131. <span class="token function-variable function">getUserFunction</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  132. <span class="token keyword">var</span> that <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span> <span class="token comment">//从对象的方法里得对象</span>
  133. <span class="token keyword">return</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  134. <span class="token keyword">return</span> that<span class="token punctuation">.</span>user<span class="token punctuation">;</span>
  135. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  136. <span class="token punctuation">}</span>
  137. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br></div></div><h3 id="内存泄漏"><a href="#内存泄漏" class="header-anchor">#</a> 内存泄漏</h3> <p>由于 IE 的 JScript 对象和 DOM 对象使用不同的垃圾收集方式,因此闭包在 IE 中会导致一些问题。就是内存泄漏的问题,也就是无法销毁驻留在内存中的元素。以下代码有两个知识点还没有学习到,一个是 DOM,一个是事件。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  138. <span class="token keyword">var</span> oDiv <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'oDiv'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//oDiv 用完之后一直驻留在内存</span>
  139. oDiv<span class="token punctuation">.</span><span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  140. <span class="token function">alert</span><span class="token punctuation">(</span>oDiv<span class="token punctuation">.</span>innerHTML<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//这里用oDiv 导致内存泄漏</span>
  141. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  142. <span class="token punctuation">}</span>
  143. <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  144. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>那么在最后应该将 oDiv 解除引用来避免内存泄漏。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  145. <span class="token keyword">var</span> oDiv <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'oDiv'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  146. <span class="token keyword">var</span> text <span class="token operator">=</span> oDiv<span class="token punctuation">.</span>innerHTML<span class="token punctuation">;</span>
  147. oDiv<span class="token punctuation">.</span><span class="token function-variable function">onclick</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  148. <span class="token function">alert</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span>
  149. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  150. oDiv <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token comment">//解除引用</span>
  151. <span class="token punctuation">}</span>
  152. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>PS:如果并没有使用解除引用,那么需要等到浏览器关闭才得以释放。模仿块级作用域 JavaScript 没有块级作用域的概念。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token parameter">count</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  153. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
  154. <span class="token function">alert</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//i 不会因为离开了for 块就失效</span>
  155. <span class="token punctuation">}</span>
  156. <span class="token function">box</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  157. <span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token parameter">count</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  158. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
  159. <span class="token keyword">var</span> i<span class="token punctuation">;</span> <span class="token comment">//就算重新声明,也不会前面的值</span>
  160. <span class="token function">alert</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span>
  161. <span class="token punctuation">}</span>
  162. <span class="token function">box</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  163. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>以上两个例子,说明 JavaScript 没有块级语句的作用域,if () {} for () {}等没有作用域,如果有,出了这个范围 i 就应该被销毁了。就算重新声明同一个变量也不会改变它的值。</p> <p><code>JavaScript</code>不会提醒你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不见(如果初始化了,当然还会执行的)。使用模仿块级作用域可避免这个问题。</p> <h3 id="模仿块级作用域-私有作用域"><a href="#模仿块级作用域-私有作用域" class="header-anchor">#</a> 模仿块级作用域(私有作用域)</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  164. <span class="token comment">//这里是块级作用域</span>
  165. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  166. <span class="token comment">//使用块级作用域(私有作用域)改写</span>
  167. <span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token parameter">count</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  168. <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  169. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
  170. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  171. <span class="token function">alert</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//报错,无法访问</span>
  172. <span class="token punctuation">}</span>
  173. <span class="token function">box</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  174. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>使用了块级作用域(私有作用域)后,匿名函数中定义的任何变量,都会在执行结束时被销毁。<br>
  175. 这种技术经常在全局作用域中被用在函数外部,从而限制向全局作用域中添加过多的变量和函数。<br>
  176. 一般来说,我们都应该尽可能少向全局作用域中添加变量和函数。在大型项目中,多人开发的时候,过多的全局变量和函数很容易导致命名冲突,引起灾难性的后果。<br>
  177. 如果采用块级作用域(私有作用域),每个开发者既可以使用自己的变量,又不必担心搞乱全局
  178. 作用域。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  179. <span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  180. <span class="token function">alert</span><span class="token punctuation">(</span>box<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//box 出来就不认识了</span>
  181. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  182. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>在全局作用域中使用块级作用域可以减少闭包占用的内存问题,因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。<br>
  183. 私有变量<code>JavaScript</code>没有私有属性的概念;所有的对象属性都是公有的。<br>
  184. 不过,却有一个私有变量的概念。任何在函数中定义的变量,都可以认为是私有变量,因为不能在函数的外部访问
  185. 这些变量。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  186. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token comment">//私有变量,外部无法访问</span>
  187. <span class="token punctuation">}</span>
  188. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>而通过函数内部创建一个闭包,那么闭包通过自己的作用域链也可以访问这些变量。而利用这一点,可以创建用于访问私有变量的公有方法。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">Box</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  189. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token comment">//私有变量</span>
  190. <span class="token keyword">function</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  191. <span class="token comment">//私有函数</span>
  192. <span class="token keyword">return</span> <span class="token string">'运行中...'</span><span class="token punctuation">;</span>
  193. <span class="token punctuation">}</span>
  194. <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">get</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  195. <span class="token comment">//对外公共的特权方法</span>
  196. <span class="token keyword">return</span> age <span class="token operator">+</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  197. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  198. <span class="token punctuation">}</span>
  199. <span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  200. <span class="token function">alert</span><span class="token punctuation">(</span>box<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  201. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h3 id="可以通过构造方法传参来访问私有变量"><a href="#可以通过构造方法传参来访问私有变量" class="header-anchor">#</a> 可以通过构造方法传参来访问私有变量</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">Person</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  202. <span class="token keyword">var</span> user <span class="token operator">=</span> value<span class="token punctuation">;</span> <span class="token comment">//这句其实可以省略</span>
  203. <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">getUser</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  204. <span class="token keyword">return</span> user<span class="token punctuation">;</span>
  205. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  206. <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">setUser</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  207. user <span class="token operator">=</span> value<span class="token punctuation">;</span>
  208. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  209. <span class="token punctuation">}</span>
  210. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>但是对象的方法,在多次调用的时候,会多次创建。可以使用静态私有变量来避免这个问题。<br>
  211. 静态私有变量通过块级作用域(私有作用域)中定义私有变量或函数,同样可以创建对外公共的特权方
  212. 法。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  213. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
  214. <span class="token keyword">function</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  215. <span class="token keyword">return</span> <span class="token string">'运行中...'</span><span class="token punctuation">;</span>
  216. <span class="token punctuation">}</span>
  217. <span class="token function-variable function">Box</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//构造方法</span>
  218. <span class="token class-name">Box</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">go</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  219. <span class="token comment">//原型方法</span>
  220. <span class="token keyword">return</span> age <span class="token operator">+</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  221. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  222. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  223. <span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Box</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  224. <span class="token function">alert</span><span class="token punctuation">(</span>box<span class="token punctuation">.</span><span class="token function">go</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  225. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>上面的对象声明,采用的是 <code>Box = function () {}</code> 而不是 <code>function Box() {}</code> 因为如果用后面这种,就变成私有函数了,无法在全局访问到了,所以使用了前面这种。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  226. <span class="token keyword">var</span> user <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span>
  227. <span class="token function-variable function">Person</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  228. user <span class="token operator">=</span> value<span class="token punctuation">;</span>
  229. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  230. <span class="token class-name">Person</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">getUser</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  231. <span class="token keyword">return</span> user<span class="token punctuation">;</span>
  232. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  233. <span class="token class-name">Person</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">setUser</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">value</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  234. user <span class="token operator">=</span> value<span class="token punctuation">;</span>
  235. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  236. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  237. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>使用了 prototype 导致方法共享了,而 user 也就变成静态属性了。(所谓静态属性,即共享于不同对象中的属性)。<br>
  238. 模块模式之前采用的都是构造函数的方式来创建私有变量和特权方法。那么对象字面量方式就采用模块模式来创建。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">//字面量对象,也是单例对象</span>
  239. age <span class="token operator">:</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token comment">//这是公有属性,将要改成私有</span>
  240. <span class="token function-variable function">run</span> <span class="token operator">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//这时公有函数,将要改成私有</span>
  241. <span class="token keyword">return</span> <span class="token string">'运行中...'</span><span class="token punctuation">;</span>
  242. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  243. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  244. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h3 id="私有化变量和函数"><a href="#私有化变量和函数" class="header-anchor">#</a> 私有化变量和函数</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  245. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
  246. <span class="token keyword">function</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  247. <span class="token keyword">return</span> <span class="token string">'运行中...'</span><span class="token punctuation">;</span>
  248. <span class="token punctuation">}</span>
  249. <span class="token keyword">return</span> <span class="token punctuation">{</span>
  250. <span class="token comment">//直接返回对象</span>
  251. <span class="token function-variable function">go</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  252. <span class="token keyword">return</span> age <span class="token operator">+</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  253. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  254. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  255. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  256. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>上面的直接返回对象的例子,也可以这么写</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  257. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
  258. <span class="token keyword">function</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  259. <span class="token keyword">return</span> <span class="token string">'运行中...'</span><span class="token punctuation">;</span>
  260. <span class="token punctuation">}</span>
  261. <span class="token keyword">var</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span>
  262. <span class="token comment">//创建字面量对象</span>
  263. <span class="token function-variable function">go</span><span class="token operator">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  264. <span class="token keyword">return</span> age <span class="token operator">+</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  265. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  266. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  267. <span class="token keyword">return</span> obj<span class="token punctuation">;</span> <span class="token comment">//返回这个对象</span>
  268. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  269. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>字面量的对象声明,其实在设计模式中可以看作是一种单例模式,所谓单例模式,就是永远保持对象的一个实例。<br>
  270. 增强的模块模式,这种模式适合返回自定义对象,也就是构造函数。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">Desk</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
  271. <span class="token keyword">var</span> box <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  272. <span class="token keyword">var</span> age <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span>
  273. <span class="token keyword">function</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  274. <span class="token keyword">return</span> <span class="token string">'运行中...'</span><span class="token punctuation">;</span>
  275. <span class="token punctuation">}</span>
  276. <span class="token keyword">var</span> desk <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Desk</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//可以实例化特定的对象</span>
  277. desk<span class="token punctuation">.</span><span class="token function-variable function">go</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  278. <span class="token keyword">return</span> age <span class="token operator">+</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  279. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  280. <span class="token keyword">return</span> desk<span class="token punctuation">;</span>
  281. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  282. <span class="token function">alert</span><span class="token punctuation">(</span>box<span class="token punctuation">.</span><span class="token function">go</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  283. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">Last Updated:</span> <span class="time">11/2/2018, 4:24:41 PM</span></div></footer> <div class="page-nav"><p class="inner"><span class="prev">
  284. <a href="/JavaScript/2018_11_02_02.html" class="prev">原理</a></span> <span class="next"><a href="/JavaScript/2018_11_02_04.html">instanceof运算符</a>
  285. </span></p></div> </main></div><div class="global-ui"></div></div>
  286. <script src="/assets/js/app.6fdf7a1a.js" defer></script><script src="/assets/js/3.d927fe3f.js" defer></script><script src="/assets/js/89.9d32b063.js" defer></script>
  287. </body>
  288. </html>