2018_11_02_02.html 137 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  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.72bab9ec.css" as="style"><link rel="preload" href="/assets/js/app.44a82e39.js" as="script"><link rel="preload" href="/assets/js/3.8ae7454d.js" as="script"><link rel="preload" href="/assets/js/88.7fb10d8d.js" as="script"><link rel="prefetch" href="/assets/js/10.dee33bc4.js"><link rel="prefetch" href="/assets/js/100.7c8a9a23.js"><link rel="prefetch" href="/assets/js/101.05f5e1eb.js"><link rel="prefetch" href="/assets/js/102.e035a30f.js"><link rel="prefetch" href="/assets/js/103.f5588224.js"><link rel="prefetch" href="/assets/js/104.3cd6cf9b.js"><link rel="prefetch" href="/assets/js/105.9ae72903.js"><link rel="prefetch" href="/assets/js/106.bb7815a1.js"><link rel="prefetch" href="/assets/js/107.048043e1.js"><link rel="prefetch" href="/assets/js/108.2f879181.js"><link rel="prefetch" href="/assets/js/109.6d921894.js"><link rel="prefetch" href="/assets/js/11.8fbf6040.js"><link rel="prefetch" href="/assets/js/110.f3be3340.js"><link rel="prefetch" href="/assets/js/111.af80c446.js"><link rel="prefetch" href="/assets/js/112.c799df40.js"><link rel="prefetch" href="/assets/js/113.c27448ef.js"><link rel="prefetch" href="/assets/js/114.75e95324.js"><link rel="prefetch" href="/assets/js/115.6c8ff112.js"><link rel="prefetch" href="/assets/js/116.e934c00e.js"><link rel="prefetch" href="/assets/js/117.e8137ce8.js"><link rel="prefetch" href="/assets/js/118.b2c3b110.js"><link rel="prefetch" href="/assets/js/119.c64cdae0.js"><link rel="prefetch" href="/assets/js/12.6363f40e.js"><link rel="prefetch" href="/assets/js/120.de5163ec.js"><link rel="prefetch" href="/assets/js/121.0c4bd6d5.js"><link rel="prefetch" href="/assets/js/122.126c75a8.js"><link rel="prefetch" href="/assets/js/123.3f4492ff.js"><link rel="prefetch" href="/assets/js/13.82c54c81.js"><link rel="prefetch" href="/assets/js/14.0a6c5c0e.js"><link rel="prefetch" href="/assets/js/15.49935a00.js"><link rel="prefetch" href="/assets/js/16.f46aca5a.js"><link rel="prefetch" href="/assets/js/17.8c2dd42a.js"><link rel="prefetch" href="/assets/js/18.a2b1092e.js"><link rel="prefetch" href="/assets/js/19.1ded9624.js"><link rel="prefetch" href="/assets/js/20.1a95bd05.js"><link rel="prefetch" href="/assets/js/21.3828a440.js"><link rel="prefetch" href="/assets/js/22.c94e1951.js"><link rel="prefetch" href="/assets/js/23.c1c9836a.js"><link rel="prefetch" href="/assets/js/24.7defc8bd.js"><link rel="prefetch" href="/assets/js/25.b66c4544.js"><link rel="prefetch" href="/assets/js/26.cc7753fb.js"><link rel="prefetch" href="/assets/js/27.79806d2f.js"><link rel="prefetch" href="/assets/js/28.3a893535.js"><link rel="prefetch" href="/assets/js/29.19cf894b.js"><link rel="prefetch" href="/assets/js/30.6fda243a.js"><link rel="prefetch" href="/assets/js/31.e1d3c8bb.js"><link rel="prefetch" href="/assets/js/32.225aec53.js"><link rel="prefetch" href="/assets/js/33.1a9f93d4.js"><link rel="prefetch" href="/assets/js/34.1461452d.js"><link rel="prefetch" href="/assets/js/35.97721728.js"><link rel="prefetch" href="/assets/js/36.93d251dc.js"><link rel="prefetch" href="/assets/js/37.2c59c75b.js"><link rel="prefetch" href="/assets/js/38.80d4d542.js"><link rel="prefetch" href="/assets/js/39.ab08c2b7.js"><link rel="prefetch" href="/assets/js/4.820ed4fb.js"><link rel="prefetch" href="/assets/js/40.0d874970.js"><link rel="prefetch" href="/assets/js/41.2c30a136.js"><link rel="prefetch" href="/assets/js/42.bb23c5e0.js"><link rel="prefetch" href="/assets/js/43.332b616a.js"><link rel="prefetch" href="/assets/js/44.475084bc.js"><link rel="prefetch" href="/assets/js/45.99acbefe.js"><link rel="prefetch" href="/assets/js/46.f8fbfa00.js"><link rel="prefetch" href="/assets/js/47.72d13e8f.js"><link rel="prefetch" href="/assets/js/48.37873401.js"><link rel="prefetch" href="/assets/js/49.34520dc5.js"><link rel="prefetch" href="/assets/js/5.380bfded.js"><link rel="prefetch" href="/assets/js/50.b29ef5c8.js"><link rel="prefetch" href="/assets/js/51.225f616f.js"><link rel="prefetch" href="/assets/js/52.cfe14ed9.js"><link rel="prefetch" href="/assets/js/53.4e2ec73a.js"><link rel="prefetch" href="/assets/js/54.8ff2afa0.js"><link rel="prefetch" href="/assets/js/55.358770f5.js"><link rel="prefetch" href="/assets/js/56.d755c0c2.js"><link rel="prefetch" href="/assets/js/57.985fc3df.js"><link rel="prefetch" href="/assets/js/58.8d2845a1.js"><link rel="prefetch" href="/assets/js/59.8d34ecec.js"><link rel="prefetch" href="/assets/js/6.eb12f52b.js"><link rel="prefetch" href="/assets/js/60.d5bd9a2b.js"><link rel="prefetch" href="/assets/js/61.dc32bd44.js"><link rel="prefetch" href="/assets/js/62.552676dd.js"><link rel="prefetch" href="/assets/js/63.b8326d03.js"><link rel="prefetch" href="/assets/js/64.fd7d8d47.js"><link rel="prefetch" href="/assets/js/65.11e3cad8.js"><link rel="prefetch" href="/assets/js/66.a4470ce0.js"><link rel="prefetch" href="/assets/js/67.cb6c8810.js"><link rel="prefetch" href="/assets/js/68.d73daf51.js"><link rel="prefetch" href="/assets/js/69.41b1f367.js"><link rel="prefetch" href="/assets/js/7.956f94fd.js"><link rel="prefetch" href="/assets/js/70.5a9d525e.js"><link rel="prefetch" href="/assets/js/71.61d2af56.js"><link rel="prefetch" href="/assets/js/72.f41a6640.js"><link rel="prefetch" href="/assets/js/73.8545072d.js"><link rel="prefetch" href="/assets/js/74.b337a1c4.js"><link rel="prefetch" href="/assets/js/75.3ff729cf.js"><link rel="prefetch" href="/assets/js/76.06c88518.js"><link rel="prefetch" href="/assets/js/77.af07aba6.js"><link rel="prefetch" href="/assets/js/78.e1d6fcf7.js"><link rel="prefetch" href="/assets/js/79.803707d9.js"><link rel="prefetch" href="/assets/js/8.f0965cfc.js"><link rel="prefetch" href="/assets/js/80.bba0c262.js"><link rel="prefetch" href="/assets/js/81.4f9053d0.js"><link rel="prefetch" href="/assets/js/82.3de526cd.js"><link rel="prefetch" href="/assets/js/83.04036093.js"><link rel="prefetch" href="/assets/js/84.4e2cf172.js"><link rel="prefetch" href="/assets/js/85.f3376af6.js"><link rel="prefetch" href="/assets/js/86.278d3f52.js"><link rel="prefetch" href="/assets/js/87.17859abd.js"><link rel="prefetch" href="/assets/js/89.6bcd0a7e.js"><link rel="prefetch" href="/assets/js/9.f39c8e32.js"><link rel="prefetch" href="/assets/js/90.dab61711.js"><link rel="prefetch" href="/assets/js/91.204e0d89.js"><link rel="prefetch" href="/assets/js/92.6fad0cca.js"><link rel="prefetch" href="/assets/js/93.765d2445.js"><link rel="prefetch" href="/assets/js/94.ecd49b4c.js"><link rel="prefetch" href="/assets/js/95.2d7fd0f1.js"><link rel="prefetch" href="/assets/js/96.5265e8c8.js"><link rel="prefetch" href="/assets/js/97.18d4ec68.js"><link rel="prefetch" href="/assets/js/98.9bc7b7b4.js"><link rel="prefetch" href="/assets/js/99.b2750206.js"><link rel="prefetch" href="/assets/js/vendors~docsearch.431cfe91.js">
  10. <link rel="stylesheet" href="/assets/css/0.styles.72bab9ec.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><li class="dropdown-item"><!----> <a href="/ffmpeg/" class="nav-link">ffmpeg</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="/mac/" class="nav-link">MACBOOK PRO</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><li class="dropdown-item"><!----> <a href="/ffmpeg/" class="nav-link">ffmpeg</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="/mac/" class="nav-link">MACBOOK PRO</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="active sidebar-link">原理</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#数据类型" class="sidebar-link">数据类型</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#object" class="sidebar-link">Object</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#判断-obj-对象" class="sidebar-link">判断 obj 对象</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#代码风格" class="sidebar-link">代码风格</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#es6-常见代码片段" class="sidebar-link">es6 常见代码片段</a></li></ul></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#html-dom-document-对象" class="sidebar-link">HTML DOM Document 对象</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#array" class="sidebar-link">Array</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#常见代码片段" class="sidebar-link">常见代码片段</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#es6-常见代码片段-2" class="sidebar-link">es6 常见代码片段</a></li></ul></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#dom" class="sidebar-link">DOM</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#闭包" class="sidebar-link">闭包</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#下面是一个简单的闭包" class="sidebar-link">下面是一个简单的闭包</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#实例-分析" class="sidebar-link">实例+分析</a></li></ul></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#写给初级-js-程序员的-javascript-闭包-译" class="sidebar-link">写给初级 JS 程序员的 JavaScript 闭包(译)</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#闭包不是魔术" class="sidebar-link">闭包不是魔术</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#闭包的实例" class="sidebar-link">闭包的实例</a></li><li class="sidebar-sub-header"><a href="/JavaScript/2018_11_02_02.html#更多例子" class="sidebar-link">更多例子</a></li></ul></li></ul></li><li><a href="/JavaScript/2018_11_02_03.html" class="sidebar-link">匿名函数和闭包</a></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> <h2 id="数据类型"><a href="#数据类型" class="header-anchor">#</a> 数据类型</h2> <div class="language-js line-numbers-mode"><pre class="language-js"><code>window<span class="token punctuation">.</span><span class="token function-variable function">onload</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  18. <span class="token keyword">var</span> test1 <span class="token operator">=</span> <span class="token string">'abcdef'</span><span class="token punctuation">;</span>
  19. <span class="token keyword">var</span> test2 <span class="token operator">=</span> <span class="token number">123</span><span class="token punctuation">;</span>
  20. <span class="token keyword">var</span> test3 <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
  21. <span class="token keyword">var</span> test4 <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
  22. <span class="token keyword">var</span> test5 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  23. <span class="token keyword">var</span> test6<span class="token punctuation">;</span>
  24. <span class="token keyword">var</span> test7 <span class="token operator">=</span> <span class="token punctuation">{</span> abcdef<span class="token punctuation">:</span> <span class="token number">123</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  25. <span class="token keyword">var</span> test8 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'abcdef'</span><span class="token punctuation">,</span> <span class="token number">123</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  26. <span class="token keyword">function</span> <span class="token function">test9</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  27. <span class="token keyword">return</span> <span class="token string">'abcdef'</span><span class="token punctuation">;</span>
  28. <span class="token punctuation">}</span>
  29. <span class="token keyword">var</span> test10 <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
  30. <span class="token keyword">var</span> test11 <span class="token operator">=</span> <span class="token string">'q58'</span><span class="token punctuation">;</span>
  31. <span class="token keyword">var</span> test12 <span class="token operator">=</span> <span class="token string">'张'</span><span class="token punctuation">;</span>
  32. <span class="token keyword">var</span> test13 <span class="token operator">=</span> <span class="token string">'78'</span><span class="token punctuation">;</span>
  33. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test1<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// string</span>
  34. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// number</span>
  35. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test3<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// boolean</span>
  36. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test4<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// object</span>
  37. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test5<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// object</span>
  38. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test6<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// undefined</span>
  39. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test7<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// object</span>
  40. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test8<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// object</span>
  41. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test9<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// function</span>
  42. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> test10<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// object</span>
  43. <span class="token comment">// # 无法转为数字的为true</span>
  44. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">isNaN</span><span class="token punctuation">(</span>test11<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
  45. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">isNaN</span><span class="token punctuation">(</span>test12<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
  46. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">isNaN</span><span class="token punctuation">(</span>test13<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// false</span>
  47. <span class="token comment">// 数值比较</span>
  48. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'1'</span> <span class="token operator">-</span> <span class="token string">'1'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  49. <span class="token comment">// 5个假值:undefined null “” 0 NaN</span>
  50. <span class="token comment">// ** 字符串方法 **</span>
  51. <span class="token comment">// toLowerCase() 字符串大写 =&gt;小写</span>
  52. <span class="token comment">// toUpperCase() 字符串小写 =&gt; 大写</span>
  53. <span class="token comment">// replace() 查找子串并将他们都替换为另一个字符串</span>
  54. <span class="token comment">// slice() 删除字符串的一部分并返回结果</span>
  55. <span class="token comment">// indexOf() 从头部开始查找子串,返回下标</span>
  56. <span class="token comment">// lastIndexOf() 查找最后一个子串,返回下标</span>
  57. <span class="token comment">// concat() 将字符串拼接起来</span>
  58. <span class="token comment">// match() 在字符串中查找与正则表达啥匹配的子串</span>
  59. <span class="token comment">// trim() 删除字符串开头和末尾的的空白字符,</span>
  60. <span class="token keyword">let</span> phone <span class="token operator">=</span> <span class="token string">'123-8568'</span><span class="token punctuation">;</span>
  61. <span class="token keyword">function</span> <span class="token function">phoneF</span><span class="token punctuation">(</span><span class="token parameter">number</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  62. <span class="token keyword">return</span> number<span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex">/^\d{3}-?\d{4}$/</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  63. <span class="token punctuation">}</span>
  64. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token function">phoneF</span><span class="token punctuation">(</span>phone<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  65. <span class="token comment">// 实例化对象</span>
  66. <span class="token keyword">function</span> <span class="token function">Duck</span><span class="token punctuation">(</span><span class="token parameter">sound</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  67. <span class="token keyword">this</span><span class="token punctuation">.</span>sound <span class="token operator">=</span> sound<span class="token punctuation">;</span>
  68. <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function-variable function">quack</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  69. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>sound<span class="token punctuation">)</span><span class="token punctuation">;</span>
  70. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  71. <span class="token punctuation">}</span>
  72. <span class="token keyword">let</span> toy <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Duck</span><span class="token punctuation">(</span><span class="token string">'quack quack'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  73. toy<span class="token punctuation">.</span><span class="token function">quack</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  74. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token keyword">typeof</span> toy<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// object</span>
  75. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>toy <span class="token keyword">instanceof</span> <span class="token class-name">Duck</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span>
  76. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  77. </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><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br></div></div><h2 id="object"><a href="#object" class="header-anchor">#</a> Object</h2> <h3 id="判断-obj-对象"><a href="#判断-obj-对象" class="header-anchor">#</a> 判断 obj 对象</h3> <p>参考文章:<a href="https://www.cnblogs.com/onepixel/p/5126046.html" target="_blank" rel="noopener noreferrer">判断 JS 数据类型的 4 种方法<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></p> <p>typeof</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">/* typeof 是一个操作符,其右侧跟一个一元表达式,
  78. 并返回这个表达式的数据类型。
  79. 返回的结果用该类型的字符串(全小写字母)形式表示,
  80. 包括以下 7 种:
  81. number、boolean、symbol、string、
  82. object、undefined、function 等。
  83. */</span>
  84. <span class="token keyword">typeof</span> <span class="token string">''</span><span class="token punctuation">;</span> <span class="token comment">// string 有效</span>
  85. <span class="token keyword">typeof</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token comment">// number 有效</span>
  86. <span class="token keyword">typeof</span> <span class="token function">Symbol</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// symbol 有效</span>
  87. <span class="token keyword">typeof</span> <span class="token boolean">true</span><span class="token punctuation">;</span> <span class="token comment">//boolean 有效</span>
  88. <span class="token keyword">typeof</span> <span class="token keyword">undefined</span><span class="token punctuation">;</span> <span class="token comment">//undefined 有效</span>
  89. <span class="token keyword">typeof</span> <span class="token keyword">null</span><span class="token punctuation">;</span> <span class="token comment">//object 无效</span>
  90. <span class="token keyword">typeof</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//object 无效</span>
  91. <span class="token keyword">typeof</span> <span class="token keyword">new</span> <span class="token class-name">Function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// function 有效</span>
  92. <span class="token keyword">typeof</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//object 无效</span>
  93. <span class="token keyword">typeof</span> <span class="token keyword">new</span> <span class="token class-name">RegExp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//object 无效</span>
  94. <span class="token comment">/*
  95. 其他正确,但不符合判断的结果
  96. 对于基本类型,除 null 以外,均可以返回正确的结果。
  97. 对于引用类型,除 function 以外,一律返回 object 类型。
  98. 对于 null ,返回 object 类型。
  99. 对于 function 返回 function 类型。
  100. */</span>
  101. </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><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br></div></div><p>instanceof</p> <ul><li><code>instanceof</code> 认为能够判断出 [ ] 是 Array 的实例,但它认为 [ ] 也是 Object 的实例
  102. why?</li> <li>从 <code>instanceof</code> 能够判断出 [ ].<strong>proto</strong> 指向 Array.prototype,而 Array.prototype.<strong>proto</strong> 又指向了 Object.prototype,最终 Object.prototype.<strong>proto</strong> 指向了 null,标志着原型链的结束。因此,[]、Array、Object 就在内部形成了一条原型链:</li></ul> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">// 内部执行过程</span>
  103. <span class="token keyword">function</span> <span class="token keyword">instanceof</span> <span class="token punctuation">(</span><span class="token parameter"><span class="token constant">A</span><span class="token punctuation">,</span><span class="token constant">B</span></span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token punctuation">{</span>
  104. <span class="token keyword">var</span> <span class="token constant">L</span> <span class="token operator">=</span> <span class="token constant">A</span><span class="token punctuation">.</span>__proto__<span class="token punctuation">;</span>
  105. <span class="token keyword">var</span> <span class="token constant">R</span> <span class="token operator">=</span> <span class="token class-name">B</span><span class="token punctuation">.</span>prototype<span class="token punctuation">;</span>
  106. <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token constant">L</span> <span class="token operator">===</span> <span class="token constant">R</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  107. <span class="token comment">// A的内部属性 __proto__ 指向 B 的原型对象</span>
  108. <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
  109. <span class="token punctuation">}</span>
  110. <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
  111. <span class="token punctuation">}</span>
  112. </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>constructor 使用技巧
  113. <img src="/images/js/2018_11_02/constructor.png" alt="constructor"></p> <p>toString</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object String]</span>
  114. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object Number]</span>
  115. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object Boolean]</span>
  116. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token function">Symbol</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">//[object Symbol]</span>
  117. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">undefined</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object Undefined]</span>
  118. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object Null]</span>
  119. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">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 comment">// [object Function]</span>
  120. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Date</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">// [object Date]</span>
  121. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</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">// [object Array]</span>
  122. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">RegExp</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">// [object RegExp]</span>
  123. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Error</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">// [object Error]</span>
  124. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>document<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object HTMLDocument]</span>
  125. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>window<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//[object global] window 是全局对象 global 的引用</span>
  126. </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">let</span> time <span class="token operator">=</span> <span class="token punctuation">{</span>
  127. <span class="token function-variable function">a</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">a</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  128. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span>
  129. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  130. <span class="token function-variable function">b</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">b</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  131. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'b:'</span> <span class="token operator">+</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span>
  132. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  133. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  134. time<span class="token punctuation">.</span><span class="token function">b</span><span class="token punctuation">(</span><span class="token number">385</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  135. </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><h3 id="es6-常见代码片段"><a href="#es6-常见代码片段" class="header-anchor">#</a> es6 常见代码片段</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">// 获取对象的key</span>
  136. Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'seamong'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  137. <span class="token comment">// 获取对象里数据的数量</span>
  138. Object<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'seamong'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span>length<span class="token punctuation">;</span>
  139. <span class="token comment">// 遍历数组</span>
  140. Object<span class="token punctuation">.</span><span class="token function">entries</span><span class="token punctuation">(</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'seamong'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  141. <span class="token comment">// extend功能</span>
  142. <span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'seamong'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">3</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  143. <span class="token keyword">const</span> newObj <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token operator">...</span>obj<span class="token punctuation">,</span> job<span class="token punctuation">:</span> <span class="token string">'IT'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">18</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  144. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>newObj<span class="token punctuation">)</span><span class="token punctuation">;</span>
  145. <span class="token comment">// 获取列表的头和尾</span>
  146. <span class="token keyword">const</span> <span class="token punctuation">[</span>head<span class="token punctuation">,</span> <span class="token operator">...</span>tail<span class="token punctuation">]</span> <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 punctuation">;</span>
  147. <span class="token keyword">const</span> <span class="token punctuation">[</span>head<span class="token punctuation">,</span> <span class="token operator">...</span>initial<span class="token punctuation">]</span> <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 punctuation">.</span><span class="token function">reverse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  148. </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><h2 id="html-dom-document-对象"><a href="#html-dom-document-对象" class="header-anchor">#</a> HTML DOM Document 对象</h2> <h4 id="给文档对象添加-移除事件句柄"><a href="#给文档对象添加-移除事件句柄" class="header-anchor">#</a> 给文档对象添加/移除事件句柄</h4> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">let</span> btnEnter <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">'btnEnter'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  149. <span class="token keyword">function</span> <span class="token function">btn</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  150. <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'单击事件,被触发'</span><span class="token punctuation">)</span><span class="token punctuation">;</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></div></div><div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">/*
  153. # addEventListener: 给文档对象添加事件句柄
  154. # 语法: document.addEventListener(event,function,useCapture)
  155. # event: 必需。描述事件名称的字符串。
  156. # function: 必需。描述了事件触发后执行的函数。
  157. # useCapture: 可选:
  158. # true - 事件句柄在捕获阶段执行
  159. # false- 默认。事件句柄在冒泡阶段执行
  160. */</span>
  161. btnEnter<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token function">btn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  162. <span class="token comment">/*您可以通过函数名来引用外部函数:*/</span>
  163. document<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> myFunction<span class="token punctuation">)</span><span class="token punctuation">;</span>
  164. <span class="token keyword">function</span> <span class="token function">myFunction</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  165. document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'demo'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">'Hello World'</span><span class="token punctuation">;</span>
  166. <span class="token punctuation">}</span>
  167. </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></div></div><div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">/*
  168. # reamveEventListener: 移除文档中的事件句柄
  169. # 语法: document.remaveEventListener(event,function,useCapture)
  170. # event: 必需。要移除的事件名称。
  171. # function: 必需。指定要移除的函数。
  172. # useCapture: 可选:
  173. # true - 事件句柄在捕获阶段移除
  174. # false- 默认。事件句柄在冒泡阶段移除
  175. */</span>
  176. <span class="token comment">// removeEventListener</span>
  177. <span class="token comment">// 移除文档对象已添加的事件句柄</span>
  178. btnEnter<span class="token punctuation">.</span><span class="token function">removeEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token function">btn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  179. </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><h4 id="返回当前获取焦点元素"><a href="#返回当前获取焦点元素" class="header-anchor">#</a> 返回当前获取焦点元素</h4> <p>语法: doucment.activeElement.tagName<br>
  180. 定义和使用:<br>
  181. activeElement 属性返回文档中当前获得焦点的元素。</p> <div class="language-html line-numbers-mode"><pre class="language-html"><code><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>btns<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span>
  182. <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>text<span class="token punctuation">&quot;</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>name<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span>
  183. <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">&quot;</span>btnName<span class="token punctuation">&quot;</span></span><span class="token punctuation">&gt;</span></span>btnName<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span>
  184. <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span>
  185. </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><div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">let</span> name <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">'name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  186. <span class="token keyword">let</span> btnName <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">'btnName'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  187. <span class="token keyword">let</span> btns <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">'btns'</span><span class="token punctuation">)</span><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>btnS<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</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>
  189. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span>activeElement<span class="token punctuation">.</span>tagName<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出所有子元素的焦点事件名称</span>
  190. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  191. </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>name<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</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>
  192. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span>activeElement<span class="token punctuation">.</span>tagName<span class="token punctuation">)</span><span class="token punctuation">;</span>
  193. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  194. </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>#### 添加 class 属性</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">// 添加class属性</span>
  195. pater1<span class="token punctuation">.</span><span class="token function">setAttribute</span><span class="token punctuation">(</span><span class="token string">'class'</span><span class="token punctuation">,</span> <span class="token string">'redtext'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  196. <span class="token comment">// 获取class属性 :只对 ID 有效,class无效</span>
  197. <span class="token keyword">let</span> href <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">'href'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  198. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>href<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'href'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  199. </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><h2 id="array"><a href="#array" class="header-anchor">#</a> Array</h2> <h3 id="常见代码片段"><a href="#常见代码片段" class="header-anchor">#</a> 常见代码片段</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">// 判断数组</span>
  200. <span class="token keyword">const</span> arr <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 number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  201. <span class="token keyword">const</span> obj <span class="token operator">=</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'hello'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  202. <span class="token comment">// instanceof方法(推荐使用)</span>
  203. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arr <span class="token keyword">instanceof</span> <span class="token class-name">Array</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true</span>
  204. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>arr <span class="token keyword">instanceof</span> <span class="token class-name">Object</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true,在数组的原型链上也能找到Object构造函数</span>
  205. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>obj <span class="token keyword">instanceof</span> <span class="token class-name">Array</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//false</span>
  206. <span class="token comment">// constructor方法(不推荐:constructor方法可以被修改)</span>
  207. <span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  208. <span class="token keyword">const</span> b <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
  209. <span class="token keyword">const</span> c <span class="token operator">=</span> <span class="token regex">/^[0-9]$/</span><span class="token punctuation">;</span>
  210. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>constructor <span class="token operator">==</span> Array<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true</span>
  211. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span>constructor <span class="token operator">==</span> Array<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//false</span>
  212. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span>constructor <span class="token operator">==</span> Array<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//false</span>
  213. <span class="token comment">// 不推荐理由</span>
  214. <span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  215. <span class="token comment">//作死将constructor属性改成了别的</span>
  216. a<span class="token punctuation">.</span>contrtuctor <span class="token operator">=</span> Object<span class="token punctuation">;</span>
  217. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>constructor <span class="token operator">==</span> Array<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//false (哭脸)</span>
  218. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>constructor <span class="token operator">==</span> Object<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true (哭脸)</span>
  219. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a <span class="token keyword">instanceof</span> <span class="token class-name">Array</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true (instanceof火眼金睛)</span>
  220. <span class="token comment">// 用Object的toString方法</span>
  221. <span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'Hello'</span><span class="token punctuation">,</span> <span class="token string">'Howard'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  222. <span class="token keyword">const</span> b <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token number">0</span><span class="token punctuation">:</span> <span class="token string">'Hello'</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">:</span> <span class="token string">'Howard'</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  223. <span class="token keyword">const</span> c <span class="token operator">=</span> <span class="token string">'Hello Howard'</span><span class="token punctuation">;</span>
  224. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">toString</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">//&quot;Hello,Howard&quot;</span>
  225. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span><span class="token function">toString</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">//&quot;[object Object]&quot;</span>
  226. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span><span class="token function">toString</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">//&quot;Hello,Howard&quot;</span>
  227. <span class="token comment">// 通过改变toString执行时的上下文判断是否为数组</span>
  228. <span class="token comment">// call | apply</span>
  229. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object Array]</span>
  230. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object Object]</span>
  231. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// [object String]</span>
  232. <span class="token comment">// or</span>
  233. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//&quot;[object Array]&quot;</span>
  234. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//&quot;[object Object]&quot;</span>
  235. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">apply</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//&quot;[object String]&quot;</span>
  236. <span class="token comment">// 合并上述过程为函数</span>
  237. <span class="token keyword">const</span> <span class="token function-variable function">isArray</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token parameter">something</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  238. <span class="token keyword">return</span> <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>something<span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token string">'[object Array]'</span><span class="token punctuation">;</span>
  239. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  240. <span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  241. <span class="token keyword">const</span> b <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
  242. <span class="token function">isArray</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true</span>
  243. <span class="token function">isArray</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//false</span>
  244. <span class="token comment">// 用Array对象的isArray方法判断</span>
  245. <span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  246. <span class="token keyword">const</span> b <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
  247. Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true</span>
  248. Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//false</span>
  249. <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function-variable function">toString</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>
  250. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">'Hello Howard'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  251. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  252. <span class="token keyword">const</span> a <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  253. Array<span class="token punctuation">.</span><span class="token function">isArray</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//true</span>
  254. <span class="token comment">// 兼容性写法</span>
  255. <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>Array<span class="token punctuation">.</span>isArray<span class="token punctuation">)</span> <span class="token punctuation">{</span>
  256. Array<span class="token punctuation">.</span><span class="token function-variable function">isArray</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">arg</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  257. <span class="token keyword">return</span> <span class="token class-name">Object</span><span class="token punctuation">.</span>prototype<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">.</span><span class="token function">call</span><span class="token punctuation">(</span>arg<span class="token punctuation">)</span> <span class="token operator">===</span> <span class="token string">'[object Array]'</span><span class="token punctuation">;</span>
  258. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  259. <span class="token punctuation">}</span>
  260. <span class="token comment">// jquery方法判断</span>
  261. <span class="token comment">// 待续</span>
  262. </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><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br></div></div><h3 id="es6-常见代码片段-2"><a href="#es6-常见代码片段-2" class="header-anchor">#</a> es6 常见代码片段</h3> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token comment">// 遍历数组</span>
  263. <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 punctuation">.</span><span class="token function">forEach</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">value<span class="token punctuation">,</span> index</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  264. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
  265. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  266. <span class="token comment">// 映射新数组</span>
  267. arr <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 punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">v</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> v <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  268. <span class="token comment">// 所有元素是否通过测试</span>
  269. <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 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><span class="token function">every</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">v</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> v <span class="token operator">&gt;</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  270. <span class="token comment">// 是否有元素通过测试</span>
  271. <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 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><span class="token function">some</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">v</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> v <span class="token operator">&gt;</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  272. <span class="token comment">// 过滤数组</span>
  273. <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 number">5</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">v</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> v <span class="token operator">&gt;</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  274. <span class="token comment">// 查找符合条件的元素:</span>
  275. arr <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'dashing'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">18</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> name<span class="token punctuation">:</span> <span class="token string">'rmos'</span><span class="token punctuation">,</span> age<span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  276. <span class="token comment">// 查找索引</span>
  277. <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 punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  278. <span class="token comment">// 连接数组</span>
  279. arr1 <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 punctuation">;</span>
  280. arr2 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  281. <span class="token punctuation">[</span><span class="token operator">...</span>arr1<span class="token punctuation">,</span> <span class="token operator">...</span>arr2<span class="token punctuation">]</span><span class="token punctuation">;</span>
  282. <span class="token comment">//数组去重</span>
  283. arr <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 number">3</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  284. <span class="token punctuation">[</span><span class="token operator">...</span>new <span class="token class-name">Set</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  285. </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><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div><h2 id="dom"><a href="#dom" class="header-anchor">#</a> DOM</h2> <h2 id="闭包"><a href="#闭包" class="header-anchor">#</a> 闭包</h2> <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">foo</span><span class="token punctuation">(</span><span class="token parameter">x</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  286. <span class="token keyword">var</span> tmp <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span>
  287. <span class="token keyword">function</span> <span class="token function">bar</span><span class="token punctuation">(</span><span class="token parameter">y</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  288. <span class="token function">alert</span><span class="token punctuation">(</span>x <span class="token operator">+</span> y <span class="token operator">+</span> <span class="token operator">++</span>tmp<span class="token punctuation">)</span><span class="token punctuation">;</span>
  289. <span class="token punctuation">}</span>
  290. <span class="token function">bar</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  291. <span class="token punctuation">}</span>
  292. <span class="token function">foo</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  293. </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>概念:<br>
  294. 闭包就是能够读取其他函数内部变量的函数。也可以理解成:定义再一个函数内部的函数。</p> <p>作用:<br>
  295. 理解函数内部与外部的桥梁</p> <p>用途:<br> 1.可以读取函数内部的变量。<br> 2.让这些变量始终保持在内存中。</p> <h3 id="实例-分析"><a href="#实例-分析" class="header-anchor">#</a> 实例+分析</h3> <h4 id="分析"><a href="#分析" class="header-anchor">#</a> 分析</h4> <p>简单来说 <code>getNameFunc()</code> 是一个闭包函数,<br>
  296. 我们在 对象 <code>Objec</code>t 中,定义了它。<br>
  297. 接着定义了 <code>var that=this</code>;<br>
  298. 并且在 <code>getNameFunc()</code> 里面,<code>return</code> 一个匿名函数,<br>
  299. return 返回 <code>that.name</code> 和 <code>this.name</code>;<br>
  300. 这个时候发现 <code>that.name ==&gt; &quot;My Object&quot;</code>;<br>
  301. 为什么这个时候 <code>this.name</code> 的值是 <code>&quot;My Object&quot;</code> 而不是<code>&quot;The Window&quot;</code>。<br>
  302. ` 这个时候,表示的是内部对象 ` 中定义的 <code>name</code> 的值。<br>
  303. 这个 <code>name</code> 的值,初始是 <code>&quot;My Object&quot;</code> ,但是在 <code>Object.getNameFunc()</code> 运行之后,<br> <code>this</code> 就不在表示 <code>Object</code> ,而是指代全局了。<br>
  304. 那么这样子的话.不论我们如何去定义 <code>this.name</code> 的值。<br>
  305. 全局中,<code>var name = &quot;The Window&quot;</code>; 被定义了。<br>
  306. 我们这个时候 去输出 <code>this.name</code> 的话.结果都是 <code>&quot;The Window&quot;</code>。<br>
  307. 那么为什么在 <code>Object.getNameFunc()</code> 函数运作之后,<code>this</code> 就表示全局了呢?<br> <code>getNameFunc()</code>是一个闭包函数。当我们运行它的时候。它被赋予全局变量<br>
  308. 它就被存入到内存中。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> name <span class="token operator">=</span> <span class="token string">'The Window'</span><span class="token punctuation">;</span>
  309. <span class="token keyword">var</span> object <span class="token operator">=</span> <span class="token punctuation">{</span>
  310. name<span class="token punctuation">:</span> <span class="token string">'My Object'</span><span class="token punctuation">,</span>
  311. <span class="token function-variable function">getNameFunc</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>
  312. <span class="token keyword">var</span> that <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">;</span>
  313. <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>
  314. <span class="token keyword">return</span> <span class="token string">'that:'</span> <span class="token operator">+</span> that<span class="token punctuation">.</span>name <span class="token operator">+</span> <span class="token string">';this:'</span> <span class="token operator">+</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token punctuation">;</span>
  315. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  316. <span class="token punctuation">}</span><span class="token punctuation">,</span>
  317. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  318. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>object<span class="token punctuation">.</span><span class="token function">getNameFunc</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">//that:My Object;this:The Window</span>
  319. </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>从技术上来讲,在 JS 中,每个 function 都是闭包,因为它总是能访问在它外部定义的数据。</p> <h2 id="写给初级-js-程序员的-javascript-闭包-译"><a href="#写给初级-js-程序员的-javascript-闭包-译" class="header-anchor">#</a> 写给初级 JS 程序员的 JavaScript 闭包(译)</h2> <p><a href="http://web.archive.org/web/20080209105120/http:/blog.morrisjohns.com/javascript_closures_for_dummies" target="_blank" rel="noopener noreferrer">原文链接<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></p> <h3 id="闭包不是魔术"><a href="#闭包不是魔术" class="header-anchor">#</a> 闭包不是魔术</h3> <p>这个页面解释了 closures,以便程序员可以理解它们 - 使用有效的 JavaScript 代码。它不是用于古茹或功能程序员。<br>
  320. 一旦核心概念被解构,闭包不难理解。然而,他们不可能通过阅读任何学术论文或面向学术的信息来了解他们!<br>
  321. 本文主要面向有主流语言编程经验的程序员,他们可以阅读以下 JavaScript 函数:</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  322. <span class="token keyword">var</span> text <span class="token operator">=</span> <span class="token string">'Hello '</span> <span class="token operator">+</span> name<span class="token punctuation">;</span>
  323. <span class="token keyword">var</span> <span class="token function-variable function">say</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>
  324. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span>
  325. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  326. <span class="token function">say</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  327. <span class="token punctuation">}</span>
  328. <span class="token function">sayHello</span><span class="token punctuation">(</span><span class="token string">'Joe'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  329. </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><h3 id="闭包的实例"><a href="#闭包的实例" class="header-anchor">#</a> 闭包的实例</h3> <p>两句话摘要:<br>
  330. 它是一个可以引用其范围内的变量(在第一次声明时),被赋值给变量,作为参数传递给函数或作为函数结果返回的表达式。<br>
  331. 闭包是一个堆栈框架,当函数开始执行时被分配,并且在函数返回之后不被释放(就好像“堆栈框架”在堆上分配而不是堆栈!)。</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">sayHello2</span><span class="token punctuation">(</span><span class="token parameter">name</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  332. <span class="token keyword">var</span> text <span class="token operator">=</span> <span class="token string">'Hello '</span> <span class="token operator">+</span> name<span class="token punctuation">;</span> <span class="token comment">// Local variable</span>
  333. <span class="token keyword">var</span> <span class="token function-variable function">say</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>
  334. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span>
  335. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  336. <span class="token keyword">return</span> say<span class="token punctuation">;</span>
  337. <span class="token punctuation">}</span>
  338. <span class="token keyword">var</span> say2 <span class="token operator">=</span> <span class="token function">sayHello2</span><span class="token punctuation">(</span><span class="token string">'Bob'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  339. <span class="token function">say2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// logs &quot;Hello Bob&quot;</span>
  340. </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>大多数 JavaScript 程序员将会理解在上面的代码中如何将一个函数的引用返回给一个变量。如果你没有,那么你需要在你可以学习闭包。AC 程序员会认为函数返回一个指向函数的指针,变量 sayAlert 和 say2 都是指向函数的指针。</p> <p>在指向函数的 C 指针和对函数的 JavaScript 引用之间存在关键的区别。在 JavaScript 中,您可以将函数引用变量看作具有指向函数的指针 以及指向闭包的隐藏指针。</p> <p>上面的代码有一个闭包,因为匿名函数 function(){alert(text); } 在另一个函数中声明,在这个例子中为 sayHello2()。在 JavaScript 中,如果在另一个函数中使用 function 关键字,则要创建一个闭包。</p> <p>在 C 和大多数其他常用语言函数返回后,所有的局部变量不再可访问,因为堆栈帧被销毁。</p> <p>在 JavaScript 中,如果在另一个函数中声明一个函数,那么在从调用的函数返回后,局部变量仍然可以访问。这是上面演示的,因为我们调用函数 say2(); 之后我们从 sayHello2()返回。请注意,我们调用的代码引用变量 text,它是函数 sayHello2()的局部变量。</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> console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Output of say2.toString();</span>
  341. </code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>看看输出 say2.toString(),我们可以看到代码引用的变量 text。匿名函数可以引用 text 保存值的值'Hello Bob',因为局部变量 sayHello2()保存在闭包中。</p> <p>神奇的是,在 JavaScript 中,函数引用还具有对其创建的闭包的秘密引用 - 类似于如何委托是方法指针加上对对象的秘密引用。</p> <hr> <h3 id="更多例子"><a href="#更多例子" class="header-anchor">#</a> 更多例子</h3> <p>出于某种原因,当你阅读关于它们的闭包似乎真的很难理解,但当你看到一些例子,你可以点击他们的工作(它花了我一段时间)。我建议仔细阅读示例,直到你了解它们如何工作。如果你开始使用闭包没有完全了解它们如何工作,你很快就会创建一些非常古怪的错误!</p> <h4 id="例-3"><a href="#例-3" class="header-anchor">#</a> 例 3</h4> <p>此示例显示不复制局部变量 - 它们通过引用保留。它是一种像在外部函数退出时在内存中保留一个堆栈框架!</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">say667</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  342. <span class="token comment">// Local variable that ends up within closure</span>
  343. <span class="token keyword">var</span> num <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span>
  344. <span class="token keyword">var</span> <span class="token function-variable function">say</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>
  345. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token punctuation">;</span>
  346. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  347. num<span class="token operator">++</span><span class="token punctuation">;</span>
  348. <span class="token keyword">return</span> say<span class="token punctuation">;</span>
  349. <span class="token punctuation">}</span>
  350. <span class="token keyword">var</span> sayNumber <span class="token operator">=</span> <span class="token function">say667</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  351. <span class="token function">sayNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// logs 43</span>
  352. </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><h4 id="例-4"><a href="#例-4" class="header-anchor">#</a> 例 4</h4> <p>所有三个全局函数具有对同一闭包的公共引用,因为它们都在单个调用中声明 setupSomeGlobals()。<br></p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">var</span> gLogNumber<span class="token punctuation">,</span> gIncreaseNumber<span class="token punctuation">,</span> gSetNumber<span class="token punctuation">;</span>
  353. <span class="token keyword">function</span> <span class="token function">setupSomeGlobals</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  354. <span class="token comment">// Local variable that ends up within closure</span>
  355. <span class="token keyword">var</span> num <span class="token operator">=</span> <span class="token number">42</span><span class="token punctuation">;</span>
  356. <span class="token comment">// Store some references to functions as global variables</span>
  357. <span class="token function-variable function">gLogNumber</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>
  358. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token punctuation">;</span>
  359. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  360. <span class="token function-variable function">gIncreaseNumber</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>
  361. num<span class="token operator">++</span><span class="token punctuation">;</span>
  362. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  363. <span class="token function-variable function">gSetNumber</span> <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">x</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  364. num <span class="token operator">=</span> x<span class="token punctuation">;</span>
  365. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  366. <span class="token punctuation">}</span>
  367. <span class="token function">setupSomeGlobals</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  368. <span class="token function">gIncreaseNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  369. <span class="token function">gLogNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 43</span>
  370. <span class="token function">gSetNumber</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  371. <span class="token function">gLogNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 5</span>
  372. <span class="token keyword">var</span> oldLog <span class="token operator">=</span> gLogNumber<span class="token punctuation">;</span>
  373. <span class="token function">setupSomeGlobals</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  374. <span class="token function">gLogNumber</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 42</span>
  375. <span class="token function">oldLog</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 5</span>
  376. </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><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br></div></div><p>这三个函数具有对同一闭包的共享访问 - setupSomeGlobals()当定义三个函数时的局部变量。<br>
  377. 注意,在上面的例子中,如果 setupSomeGlobals()再次调用,则创建一个新的闭包(stack-frame!)。老 gLogNumber,gIncreaseNumber,gSetNumber 变量将覆盖新的具有新功能关闭。(在 JavaScript 中,当你声明另一个函数内的函数,里面的功能(s)是/再次重新创建每个外部函数被调用时)。</p> <h4 id="例-5"><a href="#例-5" class="header-anchor">#</a> 例 5</h4> <p>这是一个真正的困扰,许多人,所以你需要了解它。要非常小心,如果你在一个循环中定义一个函数:从闭包的局部变量不会像你可能会想的那样。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">buildList</span><span class="token punctuation">(</span><span class="token parameter">list</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  378. <span class="token keyword">var</span> result <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
  379. <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> list<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>
  380. <span class="token keyword">var</span> item <span class="token operator">=</span> <span class="token string">'item'</span> <span class="token operator">+</span> i<span class="token punctuation">;</span>
  381. result<span class="token punctuation">.</span><span class="token function">push</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>
  382. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>item <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> list<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  383. <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  384. <span class="token punctuation">}</span>
  385. <span class="token keyword">return</span> result<span class="token punctuation">;</span>
  386. <span class="token punctuation">}</span>
  387. <span class="token keyword">function</span> <span class="token function">testList</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  388. <span class="token keyword">var</span> fnlist <span class="token operator">=</span> <span class="token function">buildList</span><span class="token punctuation">(</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 punctuation">)</span><span class="token punctuation">;</span>
  389. <span class="token comment">// Using j only to help prevent confusion -- could use i.</span>
  390. <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> fnlist<span class="token punctuation">.</span>length<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  391. fnlist<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  392. <span class="token punctuation">}</span>
  393. <span class="token punctuation">}</span>
  394. <span class="token function">testList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//logs &quot;item2 undefined&quot; 3 times</span>
  395. </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><span class="line-number">20</span><br></div></div><p>在结果数组中添加一个对匿名函数的引用三次。如果你不熟悉匿名函数, 就如:</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token function-variable function">pointer</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>
  396. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>item <span class="token operator">+</span> <span class="token string">' '</span> <span class="token operator">+</span> list<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  397. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  398. result<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>pointer<span class="token punctuation">)</span><span class="token punctuation">;</span>
  399. </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>注意,当运行示例时,“item2 undefined”会提醒三次! 这是因为就像前面的例子一样,buildList 的局部变量只有一个闭包。 当在 fnlist [j]()上调用匿名函数时; 它们都使用相同的单个闭包,并且它们使用该闭包内的 i 和项的当前值(其中 i 具有值 3,因为循环已完成,并且项具有值'item2')。 注意,我们从 0 索引,因此项目的值为 item2。 并且 i ++将 i 增加到值 3。</p> <h4 id="例-6"><a href="#例-6" class="header-anchor">#</a> 例 6</h4> <p>此示例显示,闭包包含在退出前在外部函数中声明的任何局部变量。 注意,变量 alice 实际上是在匿名函数之后声明的。 匿名函数首先声明; 并且当调用该函数时,它可以访问 alice 变量,因为 alice 在同一范围内(JavaScript 变量提升)。 另外 sayAlice()()只是直接调用从 sayAlice()返回的函数引用 - 它完全与以前做过的相同,但没有临时变量。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">sayAlice</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  400. <span class="token keyword">var</span> <span class="token function-variable function">say</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>
  401. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>alice<span class="token punctuation">)</span><span class="token punctuation">;</span>
  402. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  403. <span class="token comment">// Local variable that ends up within closure</span>
  404. <span class="token keyword">var</span> alice <span class="token operator">=</span> <span class="token string">'Hello Alice'</span><span class="token punctuation">;</span>
  405. <span class="token keyword">return</span> say<span class="token punctuation">;</span>
  406. <span class="token punctuation">}</span>
  407. <span class="token function">sayAlice</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">// logs &quot;Hello Alice&quot;</span>
  408. </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>Tricky:还要注意,say 变量也在闭包内,并且可以被可能被声明的任何其他函数访问 sayAlice(),或者它可以在内部函数内被递归地访问。</p> <h4 id="例-7"><a href="#例-7" class="header-anchor">#</a> 例 7</h4> <p>最后一个例子显示每个调用为局部变量创建一个单独的闭包。 每个函数声明没有单个闭包。 每个函数的调用都有一个闭包。</p> <div class="language-js line-numbers-mode"><pre class="language-js"><code><span class="token keyword">function</span> <span class="token function">newClosure</span><span class="token punctuation">(</span><span class="token parameter">someNum<span class="token punctuation">,</span> someRef</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  409. <span class="token comment">// Local variables that end up within closure</span>
  410. <span class="token keyword">var</span> num <span class="token operator">=</span> someNum<span class="token punctuation">;</span>
  411. <span class="token keyword">var</span> anArray <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 punctuation">;</span>
  412. <span class="token keyword">var</span> ref <span class="token operator">=</span> someRef<span class="token punctuation">;</span>
  413. <span class="token keyword">return</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token parameter">x</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  414. num <span class="token operator">+=</span> x<span class="token punctuation">;</span>
  415. anArray<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>num<span class="token punctuation">)</span><span class="token punctuation">;</span>
  416. console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>
  417. <span class="token string">'num: '</span> <span class="token operator">+</span>
  418. num <span class="token operator">+</span>
  419. <span class="token string">'; anArray: '</span> <span class="token operator">+</span>
  420. anArray<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span>
  421. <span class="token string">'; ref.someVar: '</span> <span class="token operator">+</span>
  422. ref<span class="token punctuation">.</span>someVar <span class="token operator">+</span>
  423. <span class="token string">';'</span><span class="token punctuation">,</span>
  424. <span class="token punctuation">)</span><span class="token punctuation">;</span>
  425. <span class="token punctuation">}</span><span class="token punctuation">;</span>
  426. <span class="token punctuation">}</span>
  427. obj <span class="token operator">=</span> <span class="token punctuation">{</span> someVar<span class="token punctuation">:</span> <span class="token number">4</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
  428. fn1 <span class="token operator">=</span> <span class="token function">newClosure</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> obj<span class="token punctuation">)</span><span class="token punctuation">;</span>
  429. fn2 <span class="token operator">=</span> <span class="token function">newClosure</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">,</span> obj<span class="token punctuation">)</span><span class="token punctuation">;</span>
  430. <span class="token function">fn1</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// num: 5; anArray: 1,2,3,5; ref.someVar: 4;</span>
  431. <span class="token function">fn2</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// num: 6; anArray: 1,2,3,6; ref.someVar: 4;</span>
  432. obj<span class="token punctuation">.</span>someVar<span class="token operator">++</span><span class="token punctuation">;</span>
  433. <span class="token function">fn1</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;</span>
  434. <span class="token function">fn2</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;</span>
  435. </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><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br></div></div><hr> <h4 id="概要"><a href="#概要" class="header-anchor">#</a> 概要</h4> <p>如果一切似乎完全不清楚,那么最好的办法是玩的例子。阅读解释比理解示例困难得多。我对闭包和堆栈框架等的解释在技术上是不正确的 - 它们是用于帮助理解的粗略简化。一旦基本的想法是 grokked,你可以提取细节后。</p> <h4 id="总结"><a href="#总结" class="header-anchor">#</a> 总结:</h4> <p>1.当你 function 在另一个函数里面使用时,使用闭包。</p> <p>2.每当在函数中使用 eval()时,都会使用闭包。 eval 的文本可以引用函数的局部变量,在 eval 中甚至可以使用 eval('var foo = ...')创建新的局部变量</p> <p>3.当在函数中使用新的 Function(...)(Function 构造函数)时,它不会创建闭包。 (新函数不能引用外层函数的局部变量。)</p> <p>4.JavaScript 中的闭包就像保留所有局部变量的副本,就像函数退出时一样。</p> <p>5.最好是认为闭包始终只创建一个函数的入口,局部变量将添加到闭包中。</p> <p>6.每次调用具有闭包的函数时,都会保存一组新的局部变量(假定函数在其中包含函数声明,并且对该函数的引用要么返回,要么以某种方式保留外部引用 )。</p> <p>7.两个函数可能看起来像它们具有相同的源文本,但是具有完全不同的行为,因为它们的“隐藏”闭包。 我不认为 JavaScript 代码实际上可以找出一个函数引用是否有闭包。</p> <p>8.如果你试图做任何动态源代码修改(例如:myFunction = Function(myFunction.toString()。replace(/ Hello /,'Hola'));),如果 myFunction 是一个闭包 当然,你永远不会想到在运行时做源代码字符串替换,但...)。</p> <p>9.可以在函数内的函数声明中获得函数声明 - 你可以在多个级别获得闭包。</p> <p>10.我认为通常闭包是函数和捕获的变量的术语。 注意,我在本文中不使用这个定义!</p> <p>11.我怀疑 JavaScript 中的闭包不同于通常在函数式语言中发现的闭包。</p> <h4 id="链接"><a href="#链接" class="header-anchor">#</a> 链接:</h4> <p>1.Douglas Crockford 的模拟<a href="http://www.crockford.com/javascript/private.html" target="_blank" rel="noopener noreferrer">私有属性和一个对象的私有方法<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>,使用闭包。</p> <p>2.一个伟大的解释如何闭包可以导致<a href="https://www.codeproject.com/Articles/12231/Memory-Leakage-in-Internet-Explorer-revisited" target="_blank" rel="noopener noreferrer">内存泄漏在 IE<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>如果你不小心。</p> <h4 id="感谢"><a href="#感谢" class="header-anchor">#</a> 感谢</h4> <p>If you have just learnt closures (here or elsewhere!), <br>
  436. 如果你刚刚学会了闭包(在这里或其他地方!),</p> <p>then I am interested in any feedback from you about any changes you might suggest that could make this article clearer.<br>
  437. 那么我对你提出的任何有关你可能提出的任何可能使本文更清晰的变化的反馈感兴趣。</p> <p>Send an email to morrisjohns.com (morris_closure @). Please note that I am not a guru on JavaScript - nor on closures.
  438. 发送电子邮件至morrisjohns.com(morris_closure @)。 请注意,我不是JavaScript的大师 - nor on closures.</p></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">
  439. <a href="/JavaScript/2018_11_02_01.html" class="prev">战舰游戏</a></span> <span class="next"><a href="/JavaScript/2018_11_02_03.html">匿名函数和闭包</a>
  440. </span></p></div> </main></div><div class="global-ui"></div></div>
  441. <script src="/assets/js/app.44a82e39.js" defer></script><script src="/assets/js/3.8ae7454d.js" defer></script><script src="/assets/js/88.7fb10d8d.js" defer></script>
  442. </body>
  443. </html>