<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Designdacity&#39;s BLOG</title>
  <subtitle>Life is Struggle , To Be Coder Shit.</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://yoursite.com/"/>
  <updated>2017-10-09T03:13:36.710Z</updated>
  <id>http://yoursite.com/</id>
  
  <author>
    <name>Lei Y1</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>前端面试题小集</title>
    <link href="http://yoursite.com/2017/10/09/2017/10/9/"/>
    <id>http://yoursite.com/2017/10/09/2017/10/9/</id>
    <published>2017-10-09T03:12:28.583Z</published>
    <updated>2017-10-09T03:13:36.710Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前端面试题小集"><a href="#前端面试题小集" class="headerlink" title="前端面试题小集"></a>前端面试题小集</h2><p>话不多说，先上题。</p>
<h5 id="一、一个页面上两个div左右铺满整个浏览器，要保证左边的div一直为100px，右边的div跟随浏览器大小变化（比如浏览器为500，右边div为400，浏览器为900，右边div为800），请写出大概的css代码。"><a href="#一、一个页面上两个div左右铺满整个浏览器，要保证左边的div一直为100px，右边的div跟随浏览器大小变化（比如浏览器为500，右边div为400，浏览器为900，右边div为800），请写出大概的css代码。" class="headerlink" title="一、一个页面上两个div左右铺满整个浏览器，要保证左边的div一直为100px，右边的div跟随浏览器大小变化（比如浏览器为500，右边div为400，浏览器为900，右边div为800），请写出大概的css代码。"></a>一、一个页面上两个div左右铺满整个浏览器，要保证左边的div一直为100px，右边的div跟随浏览器大小变化（比如浏览器为500，右边div为400，浏览器为900，右边div为800），请写出大概的css代码。</h5><p>1.使用flex<br><figure class="highlight htmlbars"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">//html</div><div class="line">&lt;div class='box'&gt;</div><div class="line">	&lt;div class='left'&gt;&lt;/div&gt; </div><div class="line">	&lt;div class='right'&gt;&lt;/div&gt;</div><div class="line">&lt;/div&gt;</div></pre></td></tr></table></figure></p>
<figure class="highlight css"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line">//css</div><div class="line"><span class="selector-class">.box</span> &#123;</div><div class="line">    <span class="attribute">width</span>: <span class="number">400px</span>;</div><div class="line">    <span class="attribute">height</span>: <span class="number">100px</span>;</div><div class="line">    <span class="attribute">display</span>: flex;</div><div class="line">    <span class="attribute">flex-direction</span>: row;</div><div class="line">    <span class="attribute">align-items</span>: center;</div><div class="line">    <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#c3c3c3</span>;</div><div class="line">&#125;</div><div class="line"><span class="selector-class">.left</span> &#123;</div><div class="line">    flex-basis：100px;</div><div class="line">    <span class="selector-tag">-webkit-flex-basis</span>: 100<span class="selector-tag">px</span>;</div><div class="line">    <span class="comment">/* Safari 6.1+ */</span></div><div class="line">    <span class="selector-tag">background-color</span>: <span class="selector-tag">red</span>;</div><div class="line">    <span class="selector-tag">height</span>: 100%;</div><div class="line">&#125;</div><div class="line"><span class="selector-class">.right</span> &#123;</div><div class="line">    <span class="attribute">background-color</span>: blue;</div><div class="line">    <span class="attribute">flex-grow</span>: <span class="number">1</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p> 2.浮动布局<br><figure class="highlight htmlbars"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&lt;div id="left"&gt;Left sidebar&lt;/div&gt;</div><div class="line">&lt;div id="content"&gt;Main Content&lt;/div&gt;</div></pre></td></tr></table></figure></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">&lt;style type="text/css"&gt;</div><div class="line">* &#123;</div><div class="line">    <span class="attribute">margin</span>: <span class="number">0</span>;</div><div class="line">    <span class="attribute">padding</span>: <span class="number">0</span>;</div><div class="line">&#125;</div><div class="line"><span class="selector-id">#left</span> &#123;</div><div class="line">    <span class="attribute">float</span>: left;</div><div class="line">    <span class="attribute">width</span>: <span class="number">220px</span>;</div><div class="line">    <span class="attribute">background-color</span>: green;</div><div class="line">&#125;</div><div class="line"><span class="selector-id">#content</span> &#123;</div><div class="line">    <span class="attribute">background-color</span>: orange;</div><div class="line">    <span class="attribute">margin-left</span>: <span class="number">220px</span>;</div><div class="line">    <span class="comment">/*==等于左边栏宽度==*/</span></div><div class="line">&#125;</div><div class="line">&lt;/style&gt;</div></pre></td></tr></table></figure>
<h5 id="二、请写出一些前端性能优化的方式，越多越好"><a href="#二、请写出一些前端性能优化的方式，越多越好" class="headerlink" title="二、请写出一些前端性能优化的方式，越多越好"></a>二、请写出一些前端性能优化的方式，越多越好</h5><blockquote>
<p>1.减少dom操作<br>2.部署前，图片压缩，代码压缩<br>3.优化js代码结构，减少冗余代码<br>4.减少http请求，合理设置 HTTP缓存<br>5.使用内容分发cdn加速<br>6.静态资源缓存<br>7.图片延迟加载</p>
</blockquote>
<h5 id="三、一个页面从输入-URL-到页面加载显示完成，这个过程中都发生了什么？（流程说的越详细越好）"><a href="#三、一个页面从输入-URL-到页面加载显示完成，这个过程中都发生了什么？（流程说的越详细越好）" class="headerlink" title="三、一个页面从输入 URL 到页面加载显示完成，这个过程中都发生了什么？（流程说的越详细越好）"></a>三、一个页面从输入 URL 到页面加载显示完成，这个过程中都发生了什么？（流程说的越详细越好）</h5><blockquote>
<p>输入地址<br>1.浏览器查找域名的 IP 地址<br>2.这一步包括 DNS 具体的查找过程，包括：浏览器缓存-&gt;系统缓存-&gt;路由器缓存…<br>3.浏览器向 web 服务器发送一个 HTTP 请求<br>4.服务器的永久重定向响应（从 <a href="http://example.com" target="_blank" rel="external">http://example.com</a> 到 <a href="http://www.example.com）" target="_blank" rel="external">http://www.example.com）</a><br>5.浏览器跟踪重定向地址<br>6.服务器处理请求<br>7.服务器返回一个 HTTP 响应<br>8.浏览器显示 HTML<br>9.浏览器发送请求获取嵌入在 HTML 中的资源（如图片、音频、视频、CSS、JS等等）<br>10.浏览器发送异步请求</p>
</blockquote>
<h5 id="四、请大概描述下页面访问cookie的限制条件"><a href="#四、请大概描述下页面访问cookie的限制条件" class="headerlink" title="四、请大概描述下页面访问cookie的限制条件"></a>四、请大概描述下页面访问cookie的限制条件</h5><blockquote>
<p>跨域问题<br>设置了HttpOnly</p>
</blockquote>
<h5 id="五、描述浏览器重绘和回流，哪些方法能够改善由于dom操作产生的回流"><a href="#五、描述浏览器重绘和回流，哪些方法能够改善由于dom操作产生的回流" class="headerlink" title="五、描述浏览器重绘和回流，哪些方法能够改善由于dom操作产生的回流"></a>五、描述浏览器重绘和回流，哪些方法能够改善由于dom操作产生的回流</h5><p>1.直接改变className，如果动态改变样式，则使用cssText<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不好的写法</span></div><div class="line"><span class="keyword">var</span> left = <span class="number">1</span>;</div><div class="line"><span class="keyword">var</span> top = <span class="number">1</span>;</div><div class="line">el.style.left = left + <span class="string">"px"</span>;</div><div class="line">el.style.top = top + <span class="string">"px"</span>; <span class="comment">// 比较好的写法</span></div><div class="line">el.className += <span class="string">" className1"</span>;</div><div class="line"><span class="comment">// 比较好的写法</span></div><div class="line">el.style.cssText += <span class="string">";</span></div><div class="line"><span class="string">left: "</span> + left + <span class="string">"px;</span></div><div class="line"><span class="string">top: "</span> + top + <span class="string">"px;"</span>;</div></pre></td></tr></table></figure></p>
<p>2.让要操作的元素进行”离线处理”，处理完后一起更新</p>
<blockquote>
<p>a) 使用<code>DocumentFragment</code>进行缓存操作,引发一次回流和重绘；<br>b) 使用<code>display:none</code>技术，只引发两次回流和重绘；<br>c) 使用<code>cloneNode(true or false)</code> 和 <code>replaceChild</code>技术，引发一次回流和重绘</p>
</blockquote>
<h5 id="六、vue生命周期钩子"><a href="#六、vue生命周期钩子" class="headerlink" title="六、vue生命周期钩子"></a>六、vue生命周期钩子</h5><blockquote>
<p>1.beforcreate<br>2.created<br>3.beformount<br>4.mounted<br>5.beforeUpdate<br>6.updated<br>7.actived<br>8.deatived<br>9.beforeDestroy<br>10.destroyed</p>
</blockquote>
<h5 id="七、js跨域请求的方式，能写几种是几种"><a href="#七、js跨域请求的方式，能写几种是几种" class="headerlink" title="七、js跨域请求的方式，能写几种是几种"></a>七、js跨域请求的方式，能写几种是几种</h5><blockquote>
<p>1、通过<code>jsonp</code>跨域<br>2、通过修改<code>document.domain</code>来跨子域<br>3、使用<code>window.name</code>来进行跨域<br>4、使用HTML5中新引进的<code>window.postMessage</code>方法来跨域传送数据（ie 67 不支持）<br>5、CORS 需要服务器设置<code>header ：Access-Control-Allow-Origin</code>。<br>6<code>、nginx反向代理</code> 这个方法一般很少有人提及，但是他可以不用目标服务器配合，不过需要你搭建一个中转nginx服务器，用于转发请求</p>
</blockquote>
<h5 id="八、对前端工程化的理解"><a href="#八、对前端工程化的理解" class="headerlink" title="八、对前端工程化的理解"></a>八、对前端工程化的理解</h5><blockquote>
<p>1.开发规范<br>2.模块化开发<br>3.组件化开发<br>4.组件仓库<br>5.性能优化<br>6.项目部署<br>7.开发流程<br>8.开发工具</p>
</blockquote>
<h5 id="九-js深度复制的方式"><a href="#九-js深度复制的方式" class="headerlink" title="九, js深度复制的方式"></a>九, js深度复制的方式</h5><blockquote>
<p>1.使用jq的<code>$.extend(true, target, obj)</code><br>2.<code>newobj = Object.create(sourceObj)</code>，// 但是这个是有个问题就是 newobj的更改不会影响到 sourceobj但是 sourceobj的更改会影响到newObj<br>3.<code>newobj = JSON.parse(JSON.stringify(sourceObj))</code></p>
</blockquote>
<h5 id="十、js设计模式"><a href="#十、js设计模式" class="headerlink" title="十、js设计模式"></a>十、js设计模式</h5><p>总体来说设计模式分为<code>三大类</code>：</p>
<ul>
<li>创建型模式，共五种：工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。</li>
<li>结构型模式，共七种：适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。</li>
<li>行为型模式，共十一种：策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模</li>
</ul>
<h5 id="十一、图片预览"><a href="#十一、图片预览" class="headerlink" title="十一、图片预览"></a>十一、图片预览</h5><figure class="highlight htmlbars"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&lt;input type="file" name="file" onchange="showPreview(this)" /&gt;</div><div class="line">&lt; img id="portrait" src="" width="70" height="75"&gt;</div></pre></td></tr></table></figure>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">showPreview</span>(<span class="params">source</span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> file = source.files[<span class="number">0</span>];</div><div class="line">  <span class="keyword">if</span>(<span class="built_in">window</span>.FileReader) &#123;</div><div class="line">      <span class="keyword">var</span> fr = <span class="keyword">new</span> FileReader();</div><div class="line">      fr.onloadend = <span class="function"><span class="keyword">function</span>(<span class="params">e</span>) </span>&#123;</div><div class="line">        <span class="built_in">document</span>.getElementById(<span class="string">"portrait"</span>).src = e.target.result;</div><div class="line">      &#125;;</div><div class="line">      fr.readAsDataURL(file);</div><div class="line">  &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h5 id="十二、扁平化多维数组"><a href="#十二、扁平化多维数组" class="headerlink" title="十二、扁平化多维数组"></a>十二、扁平化多维数组</h5><p>1、老方法<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> result = []</div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">unfold</span>(<span class="params">arr</span>)</span>&#123;</div><div class="line">     <span class="keyword">for</span>(<span class="keyword">var</span> i=<span class="number">0</span>;i&lt; arr.length;i++)&#123;</div><div class="line">      <span class="keyword">if</span>(<span class="keyword">typeof</span> arr[i]==<span class="string">"object"</span> &amp;&amp; arr[i].length&gt;<span class="number">1</span>) &#123;</div><div class="line">       unfold(arr[i]);</div><div class="line">     &#125; <span class="keyword">else</span> &#123;        </div><div class="line">       result.push(arr[i]);</div><div class="line">     &#125;</div><div class="line">  &#125;</div><div class="line">&#125;</div><div class="line"><span class="keyword">var</span> arr = [<span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,[<span class="number">6</span>,[<span class="number">0</span>,<span class="number">1</span>,<span class="number">5</span>],<span class="number">9</span>],[<span class="number">2</span>,<span class="number">5</span>,[<span class="number">1</span>,<span class="number">5</span>]],[<span class="number">5</span>]];</div><div class="line">unfold(arr)</div></pre></td></tr></table></figure></p>
<p>2、使用tostring<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> c=[<span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,[<span class="number">6</span>,[<span class="number">0</span>,<span class="number">1</span>,<span class="number">5</span>],<span class="number">9</span>],[<span class="number">2</span>,<span class="number">5</span>,[<span class="number">1</span>,<span class="number">5</span>]],[<span class="number">5</span>]];</div><div class="line"><span class="keyword">var</span> b = c.toString().split(<span class="string">','</span>)</div></pre></td></tr></table></figure></p>
<p>3、使用es6的reduce函数<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> arr=[<span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,[<span class="number">6</span>,[<span class="number">0</span>,<span class="number">1</span>,<span class="number">5</span>],<span class="number">9</span>],[<span class="number">2</span>,<span class="number">5</span>,[<span class="number">1</span>,<span class="number">5</span>]],[<span class="number">5</span>]];</div><div class="line"><span class="keyword">const</span> flatten = <span class="function"><span class="params">arr</span> =&gt;</span> arr.reduce(<span class="function">(<span class="params">a, b</span>) =&gt;</span> a.concat(<span class="built_in">Array</span>.isArray(b) ? flatten(b) : b), []);</div><div class="line"><span class="keyword">var</span> result = flatten(arr)</div></pre></td></tr></table></figure></p>
<h5 id="十三、iframe有那些缺点？"><a href="#十三、iframe有那些缺点？" class="headerlink" title="十三、iframe有那些缺点？"></a>十三、iframe有那些缺点？</h5><ul>
<li>iframe会阻塞主页面的Onload事件；</li>
<li>搜索引擎的检索程序无法解读这种页面，不利于SEO;</li>
<li>iframe和主页面共享连接池，而浏览器对相同域的连接有限制，所以会影响页面的并行加载。</li>
<li>使用iframe之前需要考虑这两个缺点。如果需要使用iframe，最好是通过javascript动态给iframe添加src属性值，这样可以绕开以上两个问题。</li>
</ul>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;前端面试题小集&quot;&gt;&lt;a href=&quot;#前端面试题小集&quot; class=&quot;headerlink&quot; title=&quot;前端面试题小集&quot;&gt;&lt;/a&gt;前端面试题小集&lt;/h2&gt;&lt;p&gt;话不多说，先上题。&lt;/p&gt;
&lt;h5 id=&quot;一、一个页面上两个div左右铺满整个浏览器，要保证左边的
    
    </summary>
    
      <category term="面试" scheme="http://yoursite.com/categories/%E9%9D%A2%E8%AF%95/"/>
    
    
      <category term="面试题" scheme="http://yoursite.com/tags/%E9%9D%A2%E8%AF%95%E9%A2%98/"/>
    
  </entry>
  
  <entry>
    <title>Nodejs 学习小结</title>
    <link href="http://yoursite.com/2017/09/27/2017/9/27/"/>
    <id>http://yoursite.com/2017/09/27/2017/9/27/</id>
    <published>2017-09-27T15:24:55.215Z</published>
    <updated>2017-09-27T15:24:55.896Z</updated>
    
    <content type="html"><![CDATA[<h2 id="nodejs学习小结"><a href="#nodejs学习小结" class="headerlink" title="nodejs学习小结"></a>nodejs学习小结</h2><p>    最近这段时间一直都有在玩nodejs，边学习边总结了一些零零散散的笔记，今天要总结在一起，方便自己查阅和总结。</p>
<h4 id="1-mongodb启动"><a href="#1-mongodb启动" class="headerlink" title="1. mongodb启动"></a>1. mongodb启动</h4><blockquote>
<p>确保你的电脑上安装了<code>mongodb</code>，进入<code>mongodb</code>的<code>bin</code>目录，执行<code>mongod --dbpath</code> 数据库地址。<br>例如<code>mongod --dbpath F:\dataBase</code>;</p>
</blockquote>
<h4 id="2-修改node的渲染模板"><a href="#2-修改node的渲染模板" class="headerlink" title="2. 修改node的渲染模板"></a>2. 修改node的渲染模板</h4><p>修改app.js里面的内容，可以修改为你的模板为ejs、html等<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> ejs = <span class="built_in">require</span>(<span class="string">'ejs'</span>);</div><div class="line">...</div><div class="line">app.set(<span class="string">'views'</span>, path.join(__dirname, <span class="string">'views'</span>));</div><div class="line">app.engine(<span class="string">'.html'</span>, ejs.__express);</div><div class="line">app.set(<span class="string">'view engine'</span>, <span class="string">'html'</span>);</div></pre></td></tr></table></figure></p>
<h4 id="3-获取前端传来的参数"><a href="#3-获取前端传来的参数" class="headerlink" title="3. 获取前端传来的参数"></a>3. 获取前端传来的参数</h4><ul>
<li><code>req.query</code> 主要获取GET请求传来的参数。<br>获取到的是一个object，如果要获取具体值，可以<code>req.query.id</code>等</li>
<li><code>req.params</code>获取的值是url后面的一部分，处理 get 和 post 请求<br>比如<code>GET /topic?id=58ff17984edb452fd0fa2cee&amp;node_cat=node8 200 25.245 ms - 331</code>,需要自己拆解</li>
<li><code>req.body</code>主要获取POST请求参数<br>解析body不是nodejs默认提供的，你需要载入<code>body-parser</code>中间件才可以使用<code>req.body</code><br>查找优先级由高到低为 <code>req.params→req.body→req.query</code></li>
</ul>
<h4 id="4-分页的做法"><a href="#4-分页的做法" class="headerlink" title="4. 分页的做法"></a>4. 分页的做法</h4><ul>
<li><p>可以先获取你要获取的数据的总数，这里需要mongod单独去查一次，比如</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">exports.getCountByQuery(query, callback)&#123;</div><div class="line">  Topic.count(query,callback);</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>分find结合一起使用</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> limit =<span class="built_in">Number</span>(req.query.limit) || <span class="number">10</span>;</div><div class="line"><span class="keyword">var</span> page = <span class="built_in">Number</span>(req.query.page) || <span class="number">1</span>;</div><div class="line"><span class="keyword">var</span> options = &#123;<span class="attr">skip</span>:(page - <span class="number">1</span>)* limit,<span class="attr">limit</span>:limit &#125;; </div><div class="line">exports.findByQuery(data,options,callback)&#123;</div><div class="line">  Topic.find(data,<span class="literal">null</span>,options,(err,doc) =&gt; &#123;</div><div class="line">    <span class="keyword">if</span>(err)&#123;</div><div class="line">      <span class="keyword">return</span> callback(err);</div><div class="line">    &#125;</div><div class="line">    callback(<span class="literal">null</span>,doc);</div><div class="line">  &#125;)</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="5-新建一个工程"><a href="#5-新建一个工程" class="headerlink" title="5. 新建一个工程"></a>5. 新建一个工程</h4><p>首先需要在全局安装 express <code>npm install express-generator -g</code></p>
<ul>
<li>在命令行中输入：<code>express -e 项目名</code> 初始化了一个使用 ejs 模板引擎的工程<code>cd 项目名 &amp;&amp; npm install</code></li>
<li>运行 ：<code>npm start</code> 再在浏览器输入对应的窗口即可</li>
<li><p>自动更新：<br>安装个supervisor<code>npm -g install supervisor</code>supervisor必须全局安装<br>启动时执行 <code>supervisor app.js</code>。express已经替换了启动方式，所以启动时执行 <code>supervisor ./bin/www</code></p>
<h4 id="6-小tips：快速删除node-modules"><a href="#6-小tips：快速删除node-modules" class="headerlink" title="6. 小tips：快速删除node_modules"></a>6. 小tips：快速删除node_modules</h4></li>
<li><p>安装个全局的rimraf <code>npm install rimraf -g</code>,</p>
</li>
<li><p>在需要删除<code>node_modules</code>的目录下，执行<code>rimraf node_modules</code></p>
<h4 id="7-ejs模板的引用"><a href="#7-ejs模板的引用" class="headerlink" title="7. ejs模板的引用"></a>7. ejs模板的引用</h4></li>
<li><p>在view目录下新建一个other.ejs,如果要往里面传数据，可以在router里面写<code>res.render(&#39;other&#39;, { title: &#39;hello world&#39; })</code>;<br><code>&lt;% code %&gt;</code>：JavaScript 代码。<br><code>&lt;%= code %&gt;</code>：显示替换过 HTML 特殊字符的内容。<br><code>&lt;%- code %&gt;</code>：显示原始 HTML 内容。<br>注意：<br><code>&lt;%= code %&gt;</code> 和 <code>&lt;%- code %&gt;</code> 的区别，当变量 code 为普通字符串时，两者没有区别。当 code 比如为 <code>&lt;h1&gt;hello&lt;/h1&gt;</code>这种字符串时， <code>&lt;%= code %&gt;</code>会原样输出 <code>&lt;h1&gt;hello&lt;/h1&gt;</code> ，而 <code>&lt;%- code %&gt;</code>则会显示 H1里面的 hello 字符串。</p>
</li>
</ul>
<h4 id="8-页面布局"><a href="#8-页面布局" class="headerlink" title="8. 页面布局"></a>8. 页面布局</h4><p>这里我们不使用layout进行页面布局，而是使用更为简单灵活的include。include 的简单使用如下：<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&lt;%- include a %&gt;</div><div class="line">hello,world!</div><div class="line">&lt;%- include b %&gt;</div></pre></td></tr></table></figure></p>
<p><code>exports</code>和<code>module.exports</code>的区别，<code>exports</code>仅仅是 <code>module.exports</code>的一个地址引用，如果<code>module.exports</code>已经具备一些属性和方法，那么<code>exports</code>收集来的信息将被忽略;</p>
<ul>
<li>最好别分别定义<code>module.exports</code>和<code>exports</code></li>
<li>NodeJs开发者建议导出对象用<code>module.exports</code>,导出多个方法和变量用<code>exports</code><h4 id="9-如何字符串加密"><a href="#9-如何字符串加密" class="headerlink" title="9. 如何字符串加密?"></a>9. 如何字符串加密?</h4></li>
</ul>
<p>当我们提交表单后，比如密码这些敏感信息，不做个加密处理那也太不把用户私密信息当回事了，Node.js提供了一个加密模块 crypto<br>使用方法：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">var express = require(&apos;express&apos;);</div><div class="line">var router = express.Router();</div><div class="line">var crypto = require(&apos;crypto&apos;);</div><div class="line">router.post(&apos;/&apos;,function(req, res)&#123;</div><div class="line">  var userPwd = req.body.txtUserPwd;</div><div class="line">  //生成口令的散列值</div><div class="line">  var md5 = crypto.createHash(&apos;md5&apos;);   //crypto模块功能是加密并生成各种散列</div><div class="line">  var en_upwd = md5.update(userPwd).digest(&apos;hex&apos;);</div><div class="line">  console.log(&apos;加密后的密码:&apos;+en_upwd);</div><div class="line">&#125;);</div><div class="line">module.exports = router;</div></pre></td></tr></table></figure></p>
<h4 id="10-session的使用"><a href="#10-session的使用" class="headerlink" title="10. session的使用"></a>10. session的使用</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// session的使用</span></div><div class="line">app.use(cookieParser(<span class="string">'keyboard cat'</span>));</div><div class="line"><span class="comment">//使用靠就这个中间件</span></div><div class="line">app.use(session(&#123;</div><div class="line">    secret: <span class="string">"keyboard cat"</span>,</div><div class="line">    resave: <span class="literal">true</span>,</div><div class="line">    saveUninitialized: <span class="literal">true</span></div><div class="line">&#125;));</div></pre></td></tr></table></figure>
<p>注意：坑点：！！！！需要注意的是，必须将上面几句放在<code>app.use(app.router)</code>;之前<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//使用</span></div><div class="line">req.session.name = username;</div><div class="line">req.session.pwd = pwd;</div></pre></td></tr></table></figure></p>
<p>写完后，用下面两句存储一下<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">sender.send(req.session);</div><div class="line">sender.end();</div></pre></td></tr></table></figure></p>
<h4 id="11-Express-模板传值对象app-locals、res-locals"><a href="#11-Express-模板传值对象app-locals、res-locals" class="headerlink" title="11. Express 模板传值对象app.locals、res.locals"></a>11. Express 模板传值对象app.locals、res.locals</h4><ul>
<li><code>locals</code>是Express应用中 Application(app)对象和Response(res)对象中的属性，该属性是一个对象。该对象的主要作用是，将值传递到所渲染的模板中。</li>
<li><code>locals对象</code><br>locals对象用于将数据传递至所渲染的模板中。<br>对于如下一个ejs模板：<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span></div><div class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></div><div class="line">  <span class="tag">&lt;<span class="name">head</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span><span class="tag">&lt;<span class="name">%=</span> <span class="attr">name</span> %&gt;</span><span class="tag">&lt;/<span class="name">title</span>&gt;</span></div><div class="line">  <span class="tag">&lt;/<span class="name">head</span>&gt;</span></div><div class="line">  <span class="tag">&lt;<span class="name">body</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">h1</span>&gt;</span><span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">"&lt;%= url %&gt;"</span>&gt;</span><span class="tag">&lt;<span class="name">%=</span> <span class="attr">name</span> %&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">h1</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span><span class="tag">&lt;<span class="name">%=</span> <span class="attr">introduce</span> %&gt;</span><span class="tag">&lt;/<span class="name">p</span>&gt;</span></div><div class="line">  <span class="tag">&lt;/<span class="name">body</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></div></pre></td></tr></table></figure>
</li>
</ul>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">router.get(<span class="string">'/'</span>, <span class="function"><span class="keyword">function</span>(<span class="params">req, res</span>) </span>&#123;  </div><div class="line">  res.render(<span class="string">'index'</span>, &#123;<span class="attr">name</span>:<span class="string">'IT笔录'</span>, <span class="attr">url</span>:<span class="string">'http://itbilu.com'</span>, <span class="attr">introduce</span>:<span class="string">'学习、记录、整理'</span>&#125;);</div><div class="line">  <span class="comment">// 也可以使用 res.locals 变量</span></div><div class="line">  <span class="comment">// res.locals = &#123;</span></div><div class="line">  <span class="comment">//   name:'IT笔录',</span></div><div class="line">  <span class="comment">//   url:'http://itbilu.com',</span></div><div class="line">  <span class="comment">//   introduce:'学习、记录、整理'</span></div><div class="line">  <span class="comment">// &#125;;</span></div><div class="line">  <span class="comment">// res.render('index');</span></div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<ul>
<li><code>app.locals</code>与<code>res.locals</code><br>locals可能存在于app对象中即：<code>app.locals</code>；也可能存在于res对象中，即：<code>res.locals</code>。两者都会将该对象传递至所渲染的页面中。不同的是，<code>app.locals</code>会在整个生命周期中起作用；而<code>res.locals</code>只会有当前请求中起作用。由于<code>app.locals</code>在当前应用所有的渲染模中访问，这样我们就可以在该对象中定义一些顶级/全局的数据，并在渲染模板中使用。<br><strong>注意</strong> ：使用的时候，位置应该是放在路由器的前面，这样才会生效。比如<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">app.use(local);    <span class="comment">// local是我封装了res.locals的函数，位置要在路由器的前面，不然是不行的</span></div><div class="line">app.use(<span class="string">'/'</span>,router);</div></pre></td></tr></table></figure>
</li>
</ul>
<h4 id="12-node文件读取模块fs"><a href="#12-node文件读取模块fs" class="headerlink" title="12. node文件读取模块fs"></a>12. node文件读取模块fs</h4><p>Node.js读取文件内容包括同步和异步两种方式</p>
<ul>
<li><p>同步读取，调用的是readFileSync</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> fs=<span class="built_in">require</span>(<span class="string">"fs"</span>);  </div><div class="line"><span class="keyword">var</span> data=fs.readFileSync(<span class="string">"test.js"</span>,<span class="string">"utf-8"</span>);  </div><div class="line"><span class="built_in">console</span>.log(data);</div></pre></td></tr></table></figure>
</li>
<li><p>异步读取，调用readFile</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> fs=<span class="built_in">require</span>(<span class="string">"fs"</span>);  </div><div class="line">fs.readFile(<span class="string">"test.js"</span>,<span class="string">'utf-8'</span>,<span class="function"><span class="keyword">function</span>(<span class="params">err,data</span>)</span>&#123;  </div><div class="line">    <span class="keyword">if</span>(err)&#123;  </div><div class="line">        <span class="built_in">console</span>.log(<span class="string">"error"</span>);  </div><div class="line">    &#125;<span class="keyword">else</span>&#123;  </div><div class="line">        <span class="built_in">console</span>.log(data);  </div><div class="line">    &#125;  </div><div class="line">&#125;);</div></pre></td></tr></table></figure>
</li>
</ul>
<p>fs.readFile 接收了三个参数，第一个是文件名，第二个是编码方式，第三个为回调函数。<br>其他一下fs的api<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">fs.writeFile(<span class="string">'delete.txt'</span>,<span class="string">'1234567890'</span>，<span class="function"><span class="keyword">function</span>(<span class="params">err</span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>(<span class="string">'youxi!'</span>);</div><div class="line">&#125;);</div><div class="line"><span class="comment">// 删除文件</span></div><div class="line">fs.unlink(<span class="string">'delete.txt'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line"> <span class="built_in">console</span>.log(<span class="string">'success'</span>);</div><div class="line">&#125;);</div><div class="line"><span class="comment">// 修改文件名称</span></div><div class="line">fs.rename(<span class="string">'delete.txt'</span>,<span class="string">'anew.txt'</span>,<span class="function"><span class="keyword">function</span>(<span class="params">err</span>)</span>&#123;</div><div class="line"> <span class="built_in">console</span>.log(<span class="string">'rename success'</span>);</div><div class="line"> <span class="comment">// 查看文件状态</span></div><div class="line">fs.stat(<span class="string">'anew.txt'</span>, <span class="function"><span class="keyword">function</span>(<span class="params">err, stat</span>)</span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(stat);</div><div class="line"> &#125;);</div><div class="line">&#125;);</div><div class="line"><span class="comment">// 判断文件是否存在</span></div><div class="line">fs.exists(<span class="string">'a.txt'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"> exists </span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log( exists );</div><div class="line">&#125;);</div></pre></td></tr></table></figure></p>
<h4 id="13-mongodb的使用"><a href="#13-mongodb的使用" class="headerlink" title="13. mongodb的使用"></a>13. mongodb的使用</h4><h5 id="1-、如何开启mongodb"><a href="#1-、如何开启mongodb" class="headerlink" title="(1)、如何开启mongodb"></a>(1)、如何开启mongodb</h5><ul>
<li><p>首先，进入到安装mongodb的bin目录，如<code>D:\mongodb\bin</code>,然后执行命令<code>mongod --dbpath f:\MongoDB\data</code> 其中 <code>f:\MongoDB\data</code>是文件存放路径，看到如下信息说明成功了</p>
</li>
<li><p>mongodb的默认端口为27017，所以如果开启了mongodb,可以在浏览器输入<code>http://localhost:27017/</code>,如果现实类似的<code>It looks like you are trying to access MongoDB over HTTP on the native driver port.</code>,则说明mongodb启动成功</p>
</li>
<li><p>mongoose的api地位为<a href="http://www.nodeclass.com/api/mongoose.html#quick_start" target="_blank" rel="external">http://www.nodeclass.com/api/mongoose.html#quick_start</a></p>
</li>
</ul>
<h5 id="如何查看有多少数据库"><a href="#如何查看有多少数据库" class="headerlink" title="如何查看有多少数据库"></a>如何查看有多少数据库</h5><ul>
<li>进入mongodb的bin目录，例如<code>D:\mongodb\bin</code></li>
<li>执行<code>mongo</code>,然后再执行<code>show dbs</code>可以查看到有多少数据库。</li>
<li><p>如果要使用指定的数据库的话，可以执行use 数据库名。eg:use myData<br><strong>这里需要注意的是，mongodb是需要开启的状态。即：<code>mongod --dbpath f:\MongoDB\data</code>这条命令的窗口是要开着的。</strong></p>
<h5 id="2-mongoose的使用"><a href="#2-mongoose的使用" class="headerlink" title="(2)mongoose的使用"></a>(2)mongoose的使用</h5><p>一般我们不直接用MongoDB的函数来操作MongoDB数据库,而使用mongose,mongoose就是一套操作MongoDB数据库的接口.</p>
</li>
<li><p>连接上你的数据库</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> mongoose = <span class="built_in">require</span>(<span class="string">'mongoose'</span>);</div><div class="line"><span class="keyword">var</span> db       = mongoose.connect(<span class="string">'mongodb://127.0.0.1:27017/dataBase'</span>);</div></pre></td></tr></table></figure>
</li>
<li><p>Schema<br>一种以文件形式存储的数据库模型骨架，无法直接通往数据库端，不具备对数据库的操作能力，仅仅只是数据库模型在程序片段中的一种表现，可以说是数据属性模型(传统意义的表结构)，又或着是’集合’的模型骨架。说白了就是定义数据的类型。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> UserSchema = <span class="keyword">new</span> mongoose.Schema(&#123;</div><div class="line">    username : &#123; <span class="attr">type</span> : <span class="built_in">String</span> &#125;,</div><div class="line">    password : &#123; <span class="attr">type</span> : <span class="built_in">String</span> &#125;,</div><div class="line">    avatar : &#123; <span class="attr">type</span> : <span class="built_in">String</span> &#125;,</div><div class="line">    age : &#123; <span class="attr">type</span> : <span class="built_in">Number</span> , <span class="attr">default</span> : <span class="number">0</span> &#125;,</div><div class="line">    description : &#123; <span class="attr">type</span> : <span class="built_in">String</span> &#125;,</div><div class="line">    email : &#123; <span class="attr">type</span> : <span class="built_in">String</span> &#125;,</div><div class="line">    github : &#123; <span class="attr">type</span> : <span class="built_in">String</span> &#125;,</div><div class="line">    time : &#123; <span class="attr">type</span> : <span class="built_in">Date</span> , <span class="attr">defaul</span> : <span class="built_in">Date</span>.now &#125;,</div><div class="line">&#125;);</div></pre></td></tr></table></figure>
</li>
<li><p>model<br>由Schema构造生成的模型，除了Schema定义的数据库骨架以外，还具有数据库操作的行为，类似于管理数据库属性、行为的类.<br>简单的说，就是 Schema定义了数据的类型，那么数据的操作要怎么办呢？ 定义一个类似的类，来操作 Schema声明的数据里面的类型</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> UserModel = db.model(<span class="string">"user"</span>, UserSchema );</div></pre></td></tr></table></figure>
</li>
</ul>
<p><code>user</code> 数据库中的集合名称, 不存在会创建.</p>
<ul>
<li>Entity<br>由Model创建的实体，使用save方法保存数据，Model和Entity都有能影响数据库的操作，但Model比Entity更具操作性<h6 id="1-、具体的使用"><a href="#1-、具体的使用" class="headerlink" title="(1)、具体的使用"></a>(1)、具体的使用</h6>参考<a href="http://blog.csdn.net/u014267351/article/details/51212107" target="_blank" rel="external">Mongoose使用操作</a></li>
</ul>
<h6 id="2-、Schema-表结构"><a href="#2-、Schema-表结构" class="headerlink" title="(2)、Schema - 表结构"></a>(2)、Schema - 表结构</h6><ul>
<li><p>构造函数</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">new</span> mongoose.Schema(&#123;</div><div class="line">   name:&#123;<span class="attr">type</span>:<span class="built_in">String</span>&#125;, </div><div class="line">   age:&#123;<span class="attr">type</span>:<span class="built_in">Number</span>, </div><div class="line">   <span class="keyword">default</span>:<span class="number">10</span>&#125;</div><div class="line">&#125;)</div></pre></td></tr></table></figure>
</li>
<li><p>添加属性</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Schema.add(&#123; </div><div class="line">  name: <span class="string">'String'</span>,</div><div class="line">  email: <span class="string">'String'</span>, </div><div class="line">  age: <span class="string">'Number'</span> </div><div class="line">&#125;)</div></pre></td></tr></table></figure>
</li>
<li><p>有时候Schema不仅要为后面的Model和Entity提供公共的属性，还要提供公共的方法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Schema.method(<span class="string">'say'</span>, </div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'hello'</span>);</div><div class="line">&#125;);</div><div class="line"><span class="comment">//这样Model和Entity的实例就能使用这个方法了</span></div></pre></td></tr></table></figure>
</li>
<li><p>添加静态方法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">Schema.static( <span class="string">'say'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;<span class="built_in">console</span>.log(<span class="string">'hello'</span>);&#125; )</div><div class="line"><span class="comment">//静态方法，只限于在Model层就能使用</span></div></pre></td></tr></table></figure>
</li>
<li><p>追加方法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Schema.methods.say = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'hello'</span>);</div><div class="line">&#125;; <span class="comment">//静态方法，只限于在Model层就能使用</span></div></pre></td></tr></table></figure>
</li>
</ul>
<h6 id="3-、model-文档操作"><a href="#3-、model-文档操作" class="headerlink" title="(3)、model - 文档操作"></a>(3)、model - 文档操作</h6><ul>
<li>构造函数, 参数1:集合名称, 参数2:Schema实例<br><code>db.model(&#39;test1&#39;, TestSchema )</code>;</li>
<li>查询, 参数1忽略,或为空对象则返回所有集合文档</li>
<li><code>model.find({}, callback)</code>;<br>*<code>model.find({},field,callback)</code>; 过滤查询, 参数2:<code>{&#39;name&#39;:1, &#39;age&#39;:0}</code> 查询文档的返回结果包含name, 不包含age(_id默认是1) 1为包含，0为不包含</li>
<li><code>model.find({},null,{limit:20})</code>; 过滤查询,参数3: 游标操作 limit限制返回结果数量为20个,如不足20个则返回所有.</li>
<li><code>model.findOne({}, callback)</code>; 查询找到的第一个文档</li>
<li><code>model.findById(&#39;obj._id&#39;, callback)</code>; 查询找到的第一个文档,同上. 但是只接受 __id 的值查询</li>
<li>创建, 在集合中创建一个文档<br><code>Model.create(文档数据, callback))</code></li>
<li>更新,参数 1:查询条件, 参数2:更新对象,可以使用MondoDB的更新修改器<br><code>Model.update(conditions, update, function(error)</code></li>
<li><p>删除, 参数1:查询条件<br><code>Model.remove(conditions,callback)</code>;</p>
<h6 id="4-、Entity-文档操作"><a href="#4-、Entity-文档操作" class="headerlink" title="(4)、Entity -文档操作"></a>(4)、Entity -文档操作</h6></li>
<li><p>构造函数, 其实就是model的实例<br><code>new TestModel( { name:&#39;xueyou&#39;, age:21 } )</code>;</p>
</li>
<li><p>创建, 在集合中创建一个文档.<br><code>Entity.save(callback)</code>;</p>
<h6 id="5-、修改器和更新器"><a href="#5-、修改器和更新器" class="headerlink" title="(5)、修改器和更新器"></a>(5)、修改器和更新器</h6></li>
<li><p>更新修改器:<br>‘$inc’ 增减修改器,只对数字有效.下面的实例: 找到 age=22的文档,修改文档的age值自增1<br><code>Model.update({&#39;age&#39;:22}, {&#39;$inc&#39;:{&#39;age&#39;:1} });</code> 执行后: age=23</p>
</li>
<li>‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.<br><code>Model.update({&#39;age&#39;:22}, {&#39;$set&#39;:{&#39;age&#39;:&#39;haha&#39;} })</code>; 执行后: age=’haha’</li>
<li><p>‘$unset’ 同上取反,删除一个键<br><code>Model.update({&#39;age&#39;:22}, {&#39;$unset&#39;:{&#39;age&#39;:&#39;haha&#39;} });</code>执行后: age键不存在</p>
<h6 id="6-、数组修改器"><a href="#6-、数组修改器" class="headerlink" title="(6)、数组修改器:"></a>(6)、数组修改器:</h6></li>
<li><p>‘$push’ 给一个键push一个数组成员,键不存在会创建<br><code>Model.update({&#39;age&#39;:22}, {&#39;$push&#39;:{&#39;array&#39;:10} });</code> 执行后: 增加一个 array 键,类型为数组, 有一个成员 10</p>
</li>
<li>‘$addToSet’ 向数组中添加一个元素,如果存在就不添加<br><code>Model.update({&#39;age&#39;:22}, {&#39;$addToSet&#39;:{&#39;array&#39;:10} });</code> 执行后: array中有10所以不会添加</li>
<li>‘$each’ 遍历数组, 和 $push 修改器配合可以插入多个值<br><code>Model.update({&#39;age&#39;:22}, {&#39;$push&#39;:{&#39;array&#39;:{&#39;$each&#39;: [1,2,3,4,5]}} });</code>执行后: array : [10,1,2,3,4,5]</li>
<li>‘$pop’ 向数组中尾部删除一个元素<br><code>Model.update({&#39;age&#39;:22}, {&#39;$pop&#39;:{&#39;array&#39;:1} });</code> 执行后: array : [10,1,2,3,4] tips: 将1改成-1可以删除数组首部元素</li>
<li>‘$pull’ 向数组中删除指定元素<br><code>Model.update({&#39;age&#39;:22}, {&#39;$pull&#39;:{&#39;array&#39;:10} });</code> 执行后: array : [1,2,3,4] 匹配到array中的10后将其删除<h6 id="7-、条件查询"><a href="#7-、条件查询" class="headerlink" title="(7)、条件查询:"></a>(7)、条件查询:</h6><code>&#39;$lt&#39;</code>小于<br><code>&#39;$lte&#39;</code>小于等于<br><code>&#39;$gt&#39;</code>大于<br><code>&#39;$gte&#39;</code>大于等于<br><code>&#39;$ne&#39;</code>不等于<br><code>Model.find({&#39;age&#39;:{ &#39;$gte&#39;:18 , &#39;$lte&#39;:30 } });</code>查询 age 大于等于18并小于等于30的文档</li>
</ul>
<h6 id="8-、或查询-OR"><a href="#8-、或查询-OR" class="headerlink" title="(8)、或查询 OR:"></a>(8)、或查询 OR:</h6><p><code>&#39;$in&#39;</code>一个键对应多个值<br><code>&#39;$nin&#39;</code>同上取反, 一个键不对应指定值<br><code>&#39;$or&#39;</code>多个条件匹配, 可以嵌套 $in 使用<br><code>&#39;$not&#39;</code>同上取反, 查询与特定模式不匹配的文档<br><code>Model.find({&#39;age&#39;:{ &#39;$in&#39;:[20,21,22.&#39;haha&#39;]} } );</code> 查询 age等于20或21或21或’haha’的文档<br><code>Model.find({&quot;$or&quot; : [ {&#39;age&#39;:18} , {&#39;name&#39;:&#39;xueyou&#39;} ] });</code> 查询 age等于18 或 name等于’xueyou’ 的文档</p>
<h6 id="9-、类型查询"><a href="#9-、类型查询" class="headerlink" title="(9)、类型查询:"></a>(9)、类型查询:</h6><p>null 能匹配自身和不存在的值, 想要匹配键的值 为null, 就要通过 ‘$exists’ 条件判定键值已经存在 “$exists” (表示是否存在的意思)<br><code>Model.find(&#39;age&#39; : { &#39;$in&#39; : [null] , &#39;exists&#39; : true } ); 查询 age值为null的文档
Model.find({name:{$exists:true}},function(error,docs){//查询所有存在name属性的文档});
Model.find({telephone:{$exists:false}},function(error,docs){//查询所有不存在telephone属性的文档});</code></p>
<p>######(10)、正则表达式:<br>MongoDb 使用 Prel兼容的正则表达式库来匹配正则表达式<br><code>find( {&#39;name&#39; : /joe/i } )</code>查询name为 joe 的文档, 并忽略大小写<br><code>find( {&#39;name&#39; : /joe?/i } )</code> 查询匹配各种大小写组合</p>
<h6 id="11-、查询数组"><a href="#11-、查询数组" class="headerlink" title="(11)、查询数组:"></a>(11)、查询数组:</h6><p><code>Model.find({&#39;array&#39;:10} );</code> 查询 array(数组类型)键中有10的文档, array : [1,2,3,4,5,10] 会匹配到<br><code>Model.find({&#39;array[5]&#39;:10} );</code>查询 array(数组类型)键中下标5对应的值是10, array : [1,2,3,4,5,10] 会匹配到<br>‘$all’ 匹配数组中多个元素<br><code>Model.find({&#39;array&#39;:[5,10]} );</code> 查询 匹配array数组中 既有5又有10的文档<br>‘$size’ 匹配数组长度<br><code>Model.find({&#39;array&#39;:{&quot;$size&quot; : 3} } );</code>查询 匹配array数组长度为3 的文档<br>‘$slice’ 查询子集合返回<br><code>Model.find({&#39;array&#39;:{&quot;$skice&quot; : 10} } );</code> 查询 匹配array数组的前10个元素<br><code>Model.find({&#39;array&#39;:{&quot;$skice&quot; : [5,10] } } );</code> 查询 匹配array数组的第5个到第10个元素</p>
<h6 id="12-、where"><a href="#12-、where" class="headerlink" title="(12)、where"></a>(12)、where</h6><p>用它可以执行任意javacript语句作为查询的一部分,如果回调函数返回 true 文档就作为结果的一部分返回<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">find(&#123;</div><div class="line">  <span class="string">"$where"</span>:<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">      <span class="keyword">for</span>(<span class="keyword">var</span> x <span class="keyword">in</span> <span class="keyword">this</span>)&#123;</div><div class="line">       <span class="comment">//这个函数中的 this 就是文档</span></div><div class="line">        <span class="keyword">if</span>(<span class="keyword">this</span>.x !==<span class="literal">null</span>&amp;&amp;<span class="keyword">this</span>.y !==<span class="literal">null</span>) &#123; </div><div class="line">          <span class="keyword">return</span> <span class="keyword">this</span>.x +<span class="keyword">this</span>.y ===<span class="number">10</span>?<span class="literal">true</span>:<span class="literal">false</span>;</div><div class="line">      &#125; <span class="keyword">else</span> &#123;</div><div class="line">          <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">      &#125;</div><div class="line">    &#125;</div><div class="line">&#125;);</div></pre></td></tr></table></figure></p>
<p><strong>简化版本</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">find( &#123;&quot;$where&quot; : &quot;this.x + this.y === 10&quot; &#125; )</div><div class="line">find( &#123;&quot;$where&quot; : &quot; function()&#123; return this.x + this.y ===10; &#125; &quot; &#125; )</div></pre></td></tr></table></figure></p>
<h6 id="13-、ObjectId"><a href="#13-、ObjectId" class="headerlink" title="(13)、ObjectId"></a>(13)、ObjectId</h6><p>存储在MongoDB集合中的每个文档（document）都有一个默认的主键_id，这个主键名称是固定的，它可以是mongodb支持的任何数据类型，默认是ObjectId。</p>
<h6 id="14-、mongoose中的schema-index"><a href="#14-、mongoose中的schema-index" class="headerlink" title="(14)、mongoose中的schema.index"></a>(14)、mongoose中的schema.index</h6><p>建索引是为了提高查询速度，要根据实际业务建立索引，太多了也不好，这样更新数据会变慢，因为要更新索引<br><code>TopicSchema.index({create_at: -1});</code><br>1是正序， -1是逆序，复合索引是为了提高查询速度。</p>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;nodejs学习小结&quot;&gt;&lt;a href=&quot;#nodejs学习小结&quot; class=&quot;headerlink&quot; title=&quot;nodejs学习小结&quot;&gt;&lt;/a&gt;nodejs学习小结&lt;/h2&gt;&lt;p&gt;    最近这段时间一直都有在玩nodejs，边学习边总结了一些零零散散的笔
    
    </summary>
    
      <category term="node" scheme="http://yoursite.com/categories/node/"/>
    
    
      <category term="node" scheme="http://yoursite.com/tags/node/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript中的call和apply应用</title>
    <link href="http://yoursite.com/2017/09/10/2017/9/1/"/>
    <id>http://yoursite.com/2017/09/10/2017/9/1/</id>
    <published>2017-09-10T14:43:01.063Z</published>
    <updated>2017-09-11T01:51:45.908Z</updated>
    
    <content type="html"><![CDATA[<h2 id="JavaScript中的call和apply应用"><a href="#JavaScript中的call和apply应用" class="headerlink" title="JavaScript中的call和apply应用"></a>JavaScript中的call和apply应用</h2><blockquote>
<p><code>ECMAScript3</code>给<code>Function</code>的原型定义了两个方法，他们是<code>Function.prototype.call</code> 和 <code>Function.prototype.apply</code>. 在实际开发中，特别是在一些函数式风格的代码编写中，call和apply方法尤为有用。</p>
</blockquote>
<h3 id="call和apply区别"><a href="#call和apply区别" class="headerlink" title="call和apply区别"></a>call和apply区别</h3><p>其实他们的作用是一样的，只是传递的参数不一样而已。<br><code>apply</code>接受<code>2</code>个参数，第一个参数指定了函数体内<code>this</code>对象的指向，第二个参数为数组或者一个类数组。<code>apply</code>传入的是一个参数数组，也就是将多个参数组合成为一个数组传入，而<code>call</code>则作为<code>call</code>的参数传入（从第二个参数开始）。</p>
<p>举个栗子：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> obj1 = &#123;</div><div class="line">    name: <span class="string">'designdacity'</span>,</div><div class="line">    getName: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="keyword">return</span> <span class="keyword">this</span>.name;</div><div class="line">    &#125;</div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="keyword">const</span> obj2 = &#123;</div><div class="line">    name: <span class="string">'Leiyi'</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="built_in">console</span>.log(obj1.getName());  <span class="comment">// "designdacity"</span></div><div class="line"><span class="built_in">console</span>.log(obj1.getName.call(obj2));  <span class="comment">// "Leiyi"</span></div><div class="line"><span class="built_in">console</span>.log(obj1.getName.apply(obj2));  <span class="comment">// "Leiyi"</span></div></pre></td></tr></table></figure></p>
<h3 id="call和apply的用途"><a href="#call和apply的用途" class="headerlink" title="call和apply的用途"></a>call和apply的用途</h3><h4 id="改变this指向"><a href="#改变this指向" class="headerlink" title="改变this指向"></a>改变this指向</h4><p>call和apply可以改变this的指向，这点我们从上面这个例子中可以看出。我们还可以举一个实际当中可以遇到的情况：</p>
<p>有的时候我们会觉得<code>document.getElementById</code>这个方法太长了，我们会尝试用一个短函数来代替它，如同<code>prototype.js</code>等一些框架所做过的事情，下面用代码说明：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">const</span> getId = <span class="function"><span class="keyword">function</span>(<span class="params">id</span>) </span>&#123;</div><div class="line">  <span class="keyword">return</span> <span class="built_in">document</span>.getElementById(id);</div><div class="line">&#125;</div><div class="line"></div><div class="line">getId(<span class="string">'id'</span>);</div></pre></td></tr></table></figure></p>
<p>在<code>Chrome</code>、<code>Firefox</code>、<code>IE10</code>中执行会发现抛出异常，这是因为很多引擎的 <code>document.getElementById</code>的方法内部需要用到this，这个this本来被期望指向document，但直接普通函数调用就指向了<code>window</code>。我们可以利用<code>apply</code>“修正” <code>this</code>：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">document</span>.getElementById = (<span class="function"><span class="keyword">function</span>(<span class="params">func</span>) </span>&#123;</div><div class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="keyword">return</span> func.apply(<span class="built_in">document</span>, <span class="built_in">arguments</span>);</div><div class="line">  &#125;</div><div class="line">&#125;)(<span class="built_in">document</span>.getElement);</div><div class="line"></div><div class="line"><span class="keyword">const</span> getId = <span class="built_in">document</span>.getElementById;</div></pre></td></tr></table></figure></p>
<h3 id="Function-prototype-bind"><a href="#Function-prototype-bind" class="headerlink" title="Function.prototype.bind"></a>Function.prototype.bind</h3><p>在大部分高级浏览器已经实现了内置的Function.prototype.bind，用来指定函数内部的this指向，如果没有原生的Function.prototype.bind,我们也可以模拟一个，代码如下：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">Function</span>.prototype.bind = <span class="function"><span class="keyword">function</span>(<span class="params">context</span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> self = <span class="keyword">this</span>;</div><div class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="keyword">return</span> self.apply(context, <span class="built_in">arguments</span>);</div><div class="line">  &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">var</span> obj = &#123;</div><div class="line">  name: <span class="string">'microzz'</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="keyword">var</span> func = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="keyword">this</span>.name); <span class="comment">// microzz</span></div><div class="line">&#125;.bind(obj);</div><div class="line"></div><div class="line">func();</div></pre></td></tr></table></figure></p>
<p>这是一个简化版的，通常我们会实现得稍微复杂一点：</p>
<figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">Function</span>.prototype.bind = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> self = <span class="keyword">this</span>;</div><div class="line"></div><div class="line">  <span class="comment">// 需要绑定的this上下文</span></div><div class="line">  <span class="keyword">var</span> context = [].shift.call(<span class="built_in">arguments</span>);</div><div class="line"></div><div class="line">  <span class="comment">// 剩余的参数转成数组</span></div><div class="line">  <span class="keyword">var</span> args = [].slice.call(<span class="built_in">arguments</span>);</div><div class="line"></div><div class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="keyword">return</span> self.apply(context, [].concat.call(args, [].slice.call(<span class="built_in">arguments</span>)));</div><div class="line">  &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">var</span> obj = &#123;</div><div class="line">  name: <span class="string">'microzz'</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="keyword">var</span> func = <span class="function"><span class="keyword">function</span>(<span class="params">a, b, c, d</span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="keyword">this</span>.name); <span class="comment">// microzz</span></div><div class="line">  <span class="built_in">console</span>.log([a, b, c, d]); <span class="comment">// [1, 2, 3, 4]</span></div><div class="line">&#125;.bind(obj, <span class="number">1</span>, <span class="number">2</span>);</div><div class="line"></div><div class="line">func(<span class="number">3</span>, <span class="number">4</span>);</div></pre></td></tr></table></figure>
<h3 id="借用其他对象的方法"><a href="#借用其他对象的方法" class="headerlink" title="借用其他对象的方法"></a>借用其他对象的方法</h3><h4 id="借用构造函数"><a href="#借用构造函数" class="headerlink" title="借用构造函数"></a>借用构造函数</h4><p>借用方法的第一种场景是“借用构造函数”，可以实现类似继承的效果：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> A = <span class="function"><span class="keyword">function</span>(<span class="params">name</span>) </span>&#123;</div><div class="line">  <span class="keyword">this</span>.name = name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">var</span> B = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  A.apply(<span class="keyword">this</span>, <span class="built_in">arguments</span>);</div><div class="line">&#125;</div><div class="line"></div><div class="line">B.prototype.getName = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">return</span> <span class="keyword">this</span>.name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">var</span> b = <span class="keyword">new</span> B(<span class="string">'designdacity'</span>);</div><div class="line"><span class="built_in">console</span>.log(b.getName()); <span class="comment">// designdacity</span></div></pre></td></tr></table></figure></p>
<h3 id="类数组"><a href="#类数组" class="headerlink" title="类数组"></a>类数组</h3><blockquote>
<p>函数参数列表<code>arguments</code>是一个类数组对象，虽然它有下标，但是并不是真正的数组。为了能使用数组的一些方法，我们常常会借用<code>Array.prototype</code>对象上的方法。<br>比如想往<code>arguments</code>中添加新元素，通常会借用<code>Array.prototype.push</code><br>想把<code>arguments</code>转成真正数组的时候，可以借用<code>Array.prototype.slice</code>或者也可以使用ES6的<code>Array.from</code></p>
</blockquote>
]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;JavaScript中的call和apply应用&quot;&gt;&lt;a href=&quot;#JavaScript中的call和apply应用&quot; class=&quot;headerlink&quot; title=&quot;JavaScript中的call和apply应用&quot;&gt;&lt;/a&gt;JavaScript中的ca
    
    </summary>
    
      <category term="Javascript" scheme="http://yoursite.com/categories/Javascript/"/>
    
    
      <category term="JavaScript" scheme="http://yoursite.com/tags/JavaScript/"/>
    
      <category term="call" scheme="http://yoursite.com/tags/call/"/>
    
      <category term="apply" scheme="http://yoursite.com/tags/apply/"/>
    
  </entry>
  
  <entry>
    <title>Ajax学习笔记</title>
    <link href="http://yoursite.com/2017/08/27/2017/8/3/"/>
    <id>http://yoursite.com/2017/08/27/2017/8/3/</id>
    <published>2017-08-27T12:30:16.675Z</published>
    <updated>2017-08-23T12:33:55.054Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>前后端分离的思路，所以都要通过Ajax来请求数据然后把数据渲染到页面上，一开始想过直接引用Jquery，但感觉就使用Jquery的Ajax函数，有点太浪费，所以就自己撸了一个Ajax函数。本文由浅入深，一步一步带你封装属于自己的Ajax库。</p>
</blockquote>
<h2 id="Ajax简介"><a href="#Ajax简介" class="headerlink" title="Ajax简介"></a>Ajax简介</h2><ul>
<li><code>Asynchronous Javascript And XML</code> （异步的JavaScript和XML）</li>
<li>它并不是一种单一的技术，而是有机利用一系列交互式网页应用相关的技术所形成的结合体</li>
<li><code>Ajax</code>是一种用于创建快速动态网页的技术。在前台与后台进行数据交换，<code>Ajax</code>可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下，实现局部更新。</li>
</ul>
<h3 id="1、优点"><a href="#1、优点" class="headerlink" title="1、优点"></a>1、优点</h3><blockquote>
<p>页面无刷新，用户体验好。<br>异步通信，更加快的响应能力。<br>减少冗余请求，减轻了服务器负担。<br>基于标准化的并被广泛支持的技术</p>
</blockquote>
<h3 id="2、应用场景"><a href="#2、应用场景" class="headerlink" title="2、应用场景"></a>2、应用场景</h3><pre><code>场景 1. 数据验证
场景 2. 按需取数据
场景 3. 自动更新页面
…
</code></pre><p>说了这么多，接下来来点干货。</p>
<h2 id="创建ajax的步骤"><a href="#创建ajax的步骤" class="headerlink" title="创建ajax的步骤"></a>创建ajax的步骤</h2><blockquote>
<p>Ajax的原理简单来说通过XMLHttpRequest对象来向服务器发异步请求，从服务器获得数据，然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。原生创建ajax可分为以下四步</p>
</blockquote>
<h3 id="1、创建XMLHttpRequest对象"><a href="#1、创建XMLHttpRequest对象" class="headerlink" title="1、创建XMLHttpRequest对象"></a>1、创建XMLHttpRequest对象</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">createRequest</span> (<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">if</span> (<span class="built_in">window</span>.XMLHttpRequest) &#123;</div><div class="line">        <span class="comment">//IE6以上</span></div><div class="line">        xhr = <span class="keyword">new</span> XMLHttpRequest();</div><div class="line">    &#125; <span class="keyword">else</span> &#123;</div><div class="line">        xhr = <span class="keyword">new</span> ActiveXObject(<span class="string">"Microsoft.XMLHTTP"</span>);</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> xhr;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="2、准备请求"><a href="#2、准备请求" class="headerlink" title="2、准备请求"></a>2、准备请求</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">xhr.open(method,url,<span class="keyword">async</span>);</div></pre></td></tr></table></figure>
<ul>
<li>第一个参数表示请求类型的字符串，其值可以是<code>GET</code>或者<code>POST</code></li>
</ul>
<p><code>GET</code>请求：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">xhr.open(<span class="string">"GET"</span>,demo.php?name=hzzly&amp;age=<span class="number">21</span>,<span class="literal">true</span>);</div></pre></td></tr></table></figure></p>
<p><code>POST</code>请求：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">xhr.open(<span class="string">"POST"</span>,demo.php,<span class="literal">true</span>);</div></pre></td></tr></table></figure></p>
<ul>
<li><p>第二个参数是要作为请求发送目标的URL。</p>
</li>
<li><p>第三个参数是<code>true</code>或<code>false</code>，表示请求是以<code>异步</code>还是<code>同步</code>的模式发出。（默认为true，一般不建议为false）</p>
<h3 id="3、发送请求"><a href="#3、发送请求" class="headerlink" title="3、发送请求"></a>3、发送请求</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">xhr.send();</div></pre></td></tr></table></figure>
</li>
</ul>
<p><code>GET</code>请求：<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">xhr.open(<span class="string">"GET"</span>,demo.php?name=hzzly&amp;age=<span class="number">21</span>,<span class="literal">true</span>);</div><div class="line">xhr.send();</div></pre></td></tr></table></figure></p>
<p><code>POST</code>请求:<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">xhr.open(<span class="string">"POST"</span>,demo.php,<span class="literal">true</span>);</div><div class="line">xhr.setRequestHeder(<span class="string">"Content-Type"</span>,<span class="string">"application/x-www-form-urlencoded;charset=UTF-8"</span>);</div><div class="line">xhr.send(param)</div></pre></td></tr></table></figure></p>
<h3 id="4、处理响应"><a href="#4、处理响应" class="headerlink" title="4、处理响应"></a>4、处理响应</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">xhr.onreadystatechange = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">if</span>(xhr.readyState == <span class="number">4</span> &amp;&amp; xhr.status == <span class="number">200</span>)&#123;</div><div class="line">        <span class="built_in">console</span>.log(xhr.responseText);</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<blockquote>
<ul>
<li>onreadystatechange：当处理过程发生变化的时候执行下面的函数</li>
<li>readyState：ajax处理过程<ul>
<li>0：请求未初始化（还没有调用 open()）</li>
<li>1：请求已经建立，但是还没有发送（还没有调用 send()）</li>
<li>2：请求已发送，正在处理中（通常现在可以从响应中获取内容头）</li>
<li>3：请求在处理中；通常响应中已有部分数据可用了，但是服务器还没有完成响应的生成</li>
<li>4：响应已完成；您可以获取并使用服务器的响应了</li>
</ul>
</li>
<li>status属性:<ul>
<li>200: “OK”</li>
<li>404: 未找到页面</li>
</ul>
</li>
<li><code>responseText</code>：获得字符串形式的响应数据，可以用<code>JSON.parse(xhr.responseText)</code>转化为<code>JSON</code>对象</li>
</ul>
</blockquote>
<h2 id="封装例子"><a href="#封装例子" class="headerlink" title="封装例子"></a>封装例子</h2><p>1.<code>get</code>请求函数<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * 一个简单的get请求</span></div><div class="line"><span class="comment"> * @param &#123;String&#125;   url     请求地址,文件名</span></div><div class="line"><span class="comment"> * @param &#123;Function&#125; fnSucc  请求成功时执行的函数</span></div><div class="line"><span class="comment"> * @param &#123;Function&#125; fnFaild 请求失败执行的函数</span></div><div class="line"><span class="comment"> */</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">Get</span>(<span class="params">url, fnSucc, fnFaild</span>) </span>&#123;</div><div class="line">    <span class="comment">//1.创建ajax对象</span></div><div class="line">    <span class="keyword">var</span> xhr = <span class="literal">null</span>;</div><div class="line">        <span class="comment">/**</span></div><div class="line"><span class="comment">         * 此处必须需要使用window.的方式,表示为window对象的一个属性.不存在时值为undefined.</span></div><div class="line"><span class="comment">         * 进入else若直接使用XMLHttpRequest在不支持的情况下会报错</span></div><div class="line"><span class="comment">         **/</span></div><div class="line">    <span class="keyword">if</span> (<span class="built_in">window</span>.XMLHttpRequest) &#123;</div><div class="line">        <span class="comment">//IE6以上</span></div><div class="line">        xhr = <span class="keyword">new</span> XMLHttpRequest();</div><div class="line">    &#125; <span class="keyword">else</span> &#123;</div><div class="line">        xhr = <span class="keyword">new</span> ActiveXObject(<span class="string">"Microsoft.XMLHTTP"</span>);</div><div class="line">    &#125;</div><div class="line">    <span class="comment">//2.连接服务器</span></div><div class="line">    <span class="comment">//open(方法,url,是否异步)</span></div><div class="line">    xhr.open(<span class="string">"GET"</span>, url, <span class="literal">true</span>);</div><div class="line">    <span class="comment">//3.发送请求</span></div><div class="line">    xhr.send();</div><div class="line">    <span class="comment">//4.接收返回</span></div><div class="line">    <span class="comment">//OnRedayStateChange事件</span></div><div class="line">    xhr.onreadystatechange = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="keyword">if</span> (xhr.readyState === <span class="number">4</span>) &#123;</div><div class="line">            <span class="keyword">if</span> (xhr.status === <span class="number">200</span>) &#123;</div><div class="line">                <span class="comment">//alert("成功" + xhr.responseText);</span></div><div class="line">                fnSucc(xhr.responseText);</div><div class="line">            &#125; <span class="keyword">else</span> &#123;</div><div class="line">                <span class="comment">//alert("服务器响应失败!");</span></div><div class="line">                <span class="keyword">if</span> (fnFaild) &#123;</div><div class="line">                    fnFaild();</div><div class="line">                &#125;</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line">    &#125;;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<p>2.<code>get</code>与<code>post</code>结合的请求函数<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * AJAX函数封装</span></div><div class="line"><span class="comment"> * @param &#123;string&#125; url     请求地址（必须）</span></div><div class="line"><span class="comment"> * @param &#123;object&#125; options 发送请求的选项参数</span></div><div class="line"><span class="comment"> *   @config &#123;string&#125; [options.type] 请求发送的类型。默认为GET。</span></div><div class="line"><span class="comment"> *   @config &#123;Object&#125; [options.data] 需要发送的数据。</span></div><div class="line"><span class="comment"> *   @config &#123;Function&#125; [options.onsuccess] 请求成功时触发。（必须）</span></div><div class="line"><span class="comment"> *   @config &#123;Function&#125; [options.onfail] 请求失败时触发。</span></div><div class="line"><span class="comment"> */</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">AJAX</span>(<span class="params">url, options</span>) </span>&#123;</div><div class="line">    <span class="comment">//1.创建ajax对象</span></div><div class="line">    <span class="keyword">var</span> xhr = <span class="literal">null</span>;</div><div class="line">        <span class="comment">/**</span></div><div class="line"><span class="comment">         * 此处必须需要使用window.的方式,表示为window对象的一个属性.不存在时值为undefined,进入else</span></div><div class="line"><span class="comment">         * 若直接使用XMLHttpRequest,在不支持的情况下会报错</span></div><div class="line"><span class="comment">         **/</span></div><div class="line">    <span class="keyword">if</span> (<span class="built_in">window</span>.XMLHttpRequest) &#123;</div><div class="line">        <span class="comment">//IE6以上</span></div><div class="line">        xhr = <span class="keyword">new</span> XMLHttpRequest();</div><div class="line">    &#125; <span class="keyword">else</span> &#123;</div><div class="line">        xhr = <span class="keyword">new</span> ActiveXObject(<span class="string">"Microsoft.XMLHTTP"</span>);</div><div class="line">    &#125;</div><div class="line">    <span class="comment">//2.连接服务器</span></div><div class="line">    <span class="comment">//open(方法,url,是否异步)</span></div><div class="line">    <span class="keyword">var</span> param = <span class="string">""</span>; <span class="comment">//请求参数。</span></div><div class="line">    <span class="comment">//只有data存在，且为对象使才执行</span></div><div class="line">    <span class="keyword">var</span> data = options.data ? options.data : <span class="number">-1</span>; <span class="comment">//缓存data</span></div><div class="line">    <span class="keyword">if</span> (<span class="keyword">typeof</span> (data) === <span class="string">"object"</span>) &#123;</div><div class="line">        <span class="keyword">for</span> (<span class="keyword">var</span> key <span class="keyword">in</span> data) &#123; <span class="comment">//请求参数拼接</span></div><div class="line">            <span class="keyword">if</span> (data.hasOwnProperty(key)) &#123;</div><div class="line">                param += <span class="string">`<span class="subst">$&#123;key&#125;</span>=<span class="subst">$&#123;data[key]&#125;</span>&amp;`</span>;</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line">        param.replace(<span class="regexp">/&amp;$/</span>, <span class="string">""</span>);</div><div class="line">    &#125; <span class="keyword">else</span> &#123;</div><div class="line">        param = <span class="string">"timestamp="</span> + <span class="keyword">new</span> <span class="built_in">Date</span>().getTime();</div><div class="line">    &#125;</div><div class="line">    <span class="comment">//3.发送请求</span></div><div class="line">    <span class="keyword">var</span> type = options.type ? options.type.toUpperCase() : <span class="string">"GET"</span>;</div><div class="line">    <span class="keyword">if</span> (type === <span class="string">"GET"</span>) &#123;</div><div class="line">        xhr.open(<span class="string">"GET"</span>, <span class="string">`<span class="subst">$&#123;url&#125;</span>?<span class="subst">$&#123;param&#125;</span>`</span>, <span class="literal">true</span>);</div><div class="line">        xhr.send();</div><div class="line">    &#125; <span class="keyword">else</span> &#123;</div><div class="line">        xhr.open(<span class="string">"POST"</span>, url, <span class="literal">true</span>);</div><div class="line">        xhr.setRequestHeder(<span class="string">"Content-Type"</span>,<span class="string">"application/x-www-form-urlencoded;charset=UTF-8"</span>);</div><div class="line">        xhr.send(param);</div><div class="line">    &#125;</div><div class="line">    <span class="comment">//4.接收返回</span></div><div class="line">    <span class="comment">//OnRedayStateChange事件</span></div><div class="line">    xhr.onreadystatechange = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="keyword">if</span> (xhr.readyState === <span class="number">4</span>) &#123;</div><div class="line">            <span class="keyword">if</span> (xhr.status === <span class="number">200</span>) &#123;</div><div class="line">                <span class="comment">//请求成功。形参为获取到的字符串形式的响应数据</span></div><div class="line">                options.onsuccess(xhr.responseText);</div><div class="line">            &#125; <span class="keyword">else</span> &#123;</div><div class="line">                <span class="comment">//先判断是否存在请求失败函数</span></div><div class="line">                <span class="comment">//存在时，形参为XMLHttpRequest对象，便于进行错误进行处理</span></div><div class="line">                <span class="keyword">if</span> (options.onfail) &#123;</div><div class="line">                    options.onfail(xhr);</div><div class="line">                &#125;</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line">    &#125;;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;前后端分离的思路，所以都要通过Ajax来请求数据然后把数据渲染到页面上，一开始想过直接引用Jquery，但感觉就使用Jquery的Ajax函数，有点太浪费，所以就自己撸了一个Ajax函数。本文由浅入深，一步一步带你封装属于自己的Ajax库。&lt;/p&gt;
    
    </summary>
    
      <category term="Javascript" scheme="http://yoursite.com/categories/Javascript/"/>
    
    
      <category term="JavaScript" scheme="http://yoursite.com/tags/JavaScript/"/>
    
      <category term="Ajax" scheme="http://yoursite.com/tags/Ajax/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript通过原型设计一个事件对象</title>
    <link href="http://yoursite.com/2017/08/27/2017/8/2/"/>
    <id>http://yoursite.com/2017/08/27/2017/8/2/</id>
    <published>2017-08-27T12:30:16.671Z</published>
    <updated>2017-08-20T15:19:00.402Z</updated>
    
    <content type="html"><![CDATA[<h1 id="JavaScript通过原型设计一个事件对象"><a href="#JavaScript通过原型设计一个事件对象" class="headerlink" title="JavaScript通过原型设计一个事件对象"></a>JavaScript通过原型设计一个事件对象</h1><h3 id="实现以下功能："><a href="#实现以下功能：" class="headerlink" title="实现以下功能："></a>实现以下功能：</h3><pre><code>1. 添加监听者
2. 移除监听者
3. 清空监听者
4. 发起事件信号
</code></pre><h3 id="设计思路如下："><a href="#设计思路如下：" class="headerlink" title="设计思路如下："></a>设计思路如下：</h3><pre><code>定义一个对象，包含一个实例成员listeners，用于记录所有的监听者
为对象的原型增加，新增、删除、清空和执行四个成员
具体代码可以参见下面示例
</code></pre><h3 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h3><link href="http://cdn.bootcss.com/highlight.js/8.0/styles/monokai_sublime.min.css" rel="stylesheet">

<script src="http://cdn.bootcss.com/highlight.js/8.0/highlight.min.js"></script>  
<script>hljs.initHighlightingOnLoad();</script>

<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">myEvent</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.listeners = [];    <span class="comment">//监听者列表</span></div><div class="line">&#125;</div><div class="line"><span class="comment">//添加一个监听者</span></div><div class="line">myEvent.prototype.addListener = <span class="function"><span class="keyword">function</span>(<span class="params">fn</span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.listeners.push(fn);</div><div class="line">&#125;;</div><div class="line"><span class="comment">//除移一个监听者</span></div><div class="line">myEvent.prototype.removeListener = <span class="function"><span class="keyword">function</span>(<span class="params">fn</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> index = <span class="keyword">this</span>.listeners.indexOf(fn);</div><div class="line">    <span class="keyword">this</span>.listeners.splice(index,<span class="number">1</span>);</div><div class="line">&#125;;</div><div class="line"><span class="comment">//清除所有监听者</span></div><div class="line">myEvent.prototype.clearListeners = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.listeners = [];</div><div class="line">&#125;;</div><div class="line"><span class="comment">//发出执行信号，并告之所有监听者</span></div><div class="line">myEvent.prototype.raise = <span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> l = <span class="keyword">this</span>.listeners.length;</div><div class="line">    <span class="keyword">for</span>(<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; l; i++)&#123;</div><div class="line">        <span class="keyword">this</span>.listeners[i](e);    <span class="comment">//执行所有监听方法</span></div><div class="line">    &#125;</div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="keyword">var</span> me = <span class="keyword">new</span> myEvent();</div><div class="line"></div><div class="line"><span class="comment">//事件fun1</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">fun1</span>(<span class="params">e</span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'fun1: '</span> + e);</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//事件fun2</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">fun2</span>(<span class="params">e</span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'fun2: '</span> + e);</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//调用相关方法进行测试</span></div><div class="line">me.addListener(fun1);</div><div class="line">me.addListener(fun2);</div><div class="line">me.removeListener(fun1)</div><div class="line"><span class="comment">//me.clearListeners();</span></div><div class="line">me.raise(<span class="string">"a"</span>);</div></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;JavaScript通过原型设计一个事件对象&quot;&gt;&lt;a href=&quot;#JavaScript通过原型设计一个事件对象&quot; class=&quot;headerlink&quot; title=&quot;JavaScript通过原型设计一个事件对象&quot;&gt;&lt;/a&gt;JavaScript通过原型设计一个事件
    
    </summary>
    
      <category term="Javascript" scheme="http://yoursite.com/categories/Javascript/"/>
    
    
      <category term="JavaScript" scheme="http://yoursite.com/tags/JavaScript/"/>
    
      <category term="prototype" scheme="http://yoursite.com/tags/prototype/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript编码规范指南</title>
    <link href="http://yoursite.com/2017/08/27/2017/8/1/"/>
    <id>http://yoursite.com/2017/08/27/2017/8/1/</id>
    <published>2017-08-27T12:30:16.650Z</published>
    <updated>2017-08-20T11:54:46.801Z</updated>
    
    <content type="html"><![CDATA[<p>=====================<br>常用的一些javascript规范</p>
<h1 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h1><p><strong>原始类型(Primitives)</strong>：当你给一个原始类型赋值时，返回的是这个值的本身。</p>
<ul>
<li>string</li>
<li>number</li>
<li>boolean</li>
<li>null</li>
<li>undefined</li>
</ul>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">    <span class="keyword">var</span> foo = <span class="number">1</span>,</div><div class="line">    bar = foo;</div><div class="line">    bar = <span class="number">9</span>; </div><div class="line">    <span class="built_in">console</span>.log(foo, bar); <span class="comment">// =&gt; 1, 9</span></div><div class="line"><span class="string">``</span><span class="string">`  </span></div><div class="line"><span class="string">    </span></div><div class="line"><span class="string">**对象类型**:当你给一个对象类型赋值时，返回的是这个值的引用。</span></div><div class="line"><span class="string"></span></div><div class="line"><span class="string">* object</span></div><div class="line"><span class="string">* array</span></div><div class="line"><span class="string">* function</span></div><div class="line"><span class="string">`</span><span class="string">``</span>javascript</div><div class="line"><span class="keyword">var</span> foo = [<span class="number">1</span>, <span class="number">2</span>],</div><div class="line">  bar = foo;</div><div class="line"></div><div class="line">bar[<span class="number">0</span>] = <span class="number">9</span>;</div><div class="line"></div><div class="line"><span class="built_in">console</span>.log(foo[<span class="number">0</span>], bar[<span class="number">0</span>]); <span class="comment">// =&gt; 9, 9</span></div></pre></td></tr></table></figure>
<h1 id="对象"><a href="#对象" class="headerlink" title="对象"></a>对象</h1><ul>
<li><p>新建一个对象的语法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> item = <span class="keyword">new</span> <span class="built_in">Object</span>();</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> item = &#123;&#125;;</div></pre></td></tr></table></figure>
</li>
<li><p>不要使用<code>保留字</code>作为键值，否则在IE8下面会出现问题(详情)。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> superman = &#123;</div><div class="line">  <span class="keyword">default</span>: &#123; <span class="attr">clark</span>: <span class="string">'kent'</span>&#125;,</div><div class="line">  private: <span class="literal">true</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> superman =&#123;</div><div class="line">  defaults: &#123; <span class="attr">clark</span>: <span class="string">'kent'</span>&#125;,</div><div class="line">  hidden: <span class="literal">true</span></div><div class="line">&#125;;</div></pre></td></tr></table></figure>
</li>
<li><p>使用可读性强的同义词代替保留字</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> superman = &#123;</div><div class="line">  class: 'alien'</div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> superman = &#123;</div><div class="line">  klass: <span class="string">'alien'</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> superman = &#123;</div><div class="line">  type: <span class="string">'alien'</span></div><div class="line">&#125;;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="数组"><a href="#数组" class="headerlink" title="数组"></a>数组</h1><ul>
<li><p>新建一个数组的语法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> items = <span class="keyword">new</span> <span class="built_in">Array</span>();</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> items = [];</div></pre></td></tr></table></figure>
</li>
<li><p>如果你不知道数组的长度可以使用push将元素加入。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> someStack = [];</div><div class="line"></div><div class="line"><span class="comment">//不推荐</span></div><div class="line">someStack[someStack.length] = <span class="string">'something'</span>;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line">someStack.push(<span class="string">'something'</span>);</div></pre></td></tr></table></figure>
</li>
<li><p>当你需要复制一个数组的时候使用slice。<code>jsPerf</code></p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> len = items.length,</div><div class="line">  itemsCopy = [],</div><div class="line">  i;</div><div class="line"></div><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; len; i++)&#123;</div><div class="line">  itemsCopy[i] = items[i];</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line">itemsCopy = items.slice();</div></pre></td></tr></table></figure>
</li>
<li><p>用slice转换伪数组对象到数组</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">trigger</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> args = <span class="built_in">Array</span>.prototype.slice.call(<span class="built_in">arguments</span>);</div><div class="line">  ...</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="String类型"><a href="#String类型" class="headerlink" title="String类型"></a>String类型</h1><ul>
<li><p>使用单引号’’</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> name = <span class="string">"Bob Parr"</span>;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> name = <span class="string">'Bob Parr'</span>;</div><div class="line"></div><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> fullName - <span class="string">"Bob "</span> + <span class="keyword">this</span>.lastName;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> fullName = <span class="string">'Bob '</span> + <span class="keyword">this</span>.lastName;</div></pre></td></tr></table></figure>
</li>
<li><p>当字符串长度超过80个时，应该通过字符串连接多行显示。</p>
</li>
<li><p>注意：过度使用字符串连接将会影响性能。<code>jsPerf</code>&amp;<code>Discussion</code></p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> errorMessage = <span class="string">'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.'</span>;</div><div class="line"></div><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">var</span> errorMessage = <span class="string">'This is a super long error that \</span></div><div class="line"><span class="string">was thrown because of Batman. \</span></div><div class="line"><span class="string">When you stop to think about \</span></div><div class="line"><span class="string">how Batman had anything to do \</span></div><div class="line"><span class="string">with this, you would get nowhere \</span></div><div class="line"><span class="string">fast.'</span>;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">var</span> errorMessage = <span class="string">'This is a super long error that '</span> +</div><div class="line">  <span class="string">'was thrown because of Batman.'</span> +</div><div class="line">  <span class="string">'When you stop to think about '</span> +</div><div class="line">  <span class="string">'how Batman had anything to do '</span> +</div><div class="line">  <span class="string">'with this, you would get nowhere '</span> +</div><div class="line">  <span class="string">'fast.'</span>;</div></pre></td></tr></table></figure>
</li>
<li><p>当程序建立一个字符串时， 使用<code>join</code>代替字符串连接。特别是在IE下：<code>jsPerf</code></p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> items,</div><div class="line">    messages,</div><div class="line">    length, i;</div><div class="line"></div><div class="line">messages = [&#123;</div><div class="line">    state: <span class="string">'success'</span>,</div><div class="line">    message: <span class="string">'This one worked.'</span></div><div class="line">&#125;,&#123;</div><div class="line">    state: <span class="string">'success'</span>,</div><div class="line">    message: <span class="string">'This one worked as well.'</span></div><div class="line">&#125;,&#123;</div><div class="line">    state: <span class="string">'error'</span>,</div><div class="line">    message: <span class="string">'This one did not work.'</span></div><div class="line">&#125;];</div><div class="line"></div><div class="line">length = messages.length;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">inbox</span>(<span class="params">messages</span>) </span>&#123;</div><div class="line">  items = <span class="string">'&lt;ul&gt;'</span>;</div><div class="line"></div><div class="line">  <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; length; i++) &#123;</div><div class="line">    items += <span class="string">'&lt;li&gt;'</span> + messages[i].message + <span class="string">'&lt;/li&gt;'</span>;</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> items + <span class="string">'&lt;/ul&gt;'</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">inbox</span>(<span class="params">messages</span>) </span>&#123;</div><div class="line">  items = [];</div><div class="line"></div><div class="line">  <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; length; i++) &#123;</div><div class="line">    items[i] = messages[i].message;</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> <span class="string">'&lt;ul&gt;&lt;li&gt;'</span> + items.join(<span class="string">'&lt;/li&gt;&lt;li&gt;'</span>) + <span class="string">'&lt;/li&gt;&lt;/ul&gt;'</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h1><ul>
<li><p>函数表达式：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 匿名函数表达式</span></div><div class="line"><span class="keyword">var</span> anonymous = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 命名函数表达式</span></div><div class="line"><span class="keyword">var</span> named = <span class="function"><span class="keyword">function</span> <span class="title">named</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="comment">// 立即执行的函数表达式（IIFE）</span></div><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'Welcome to the Internet. Please follow me.'</span>);</div><div class="line">&#125;)();</div></pre></td></tr></table></figure>
</li>
<li><p>不要将函数声明放在如if/while循环或其他任何语句中。但可以用函数表达式来替代函数声明这么做。一些浏览器可能的确可以在语句中使用函数声明。但是在解析方面的处理各不相同，各种浏览器下兼容性很不好。</p>
</li>
</ul>
<p><strong>注意</strong>: ECMA-262定义了一系列的语句，但是函数声明并没有被归类为真正的语句。关于这点可查看<a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97" target="_blank" rel="external">ECMA-262的文档</a><br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="keyword">if</span> (currentUser)&#123;</div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'Nope.'</span>);</div><div class="line">  &#125;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="keyword">if</span> (currentUser)&#123;</div><div class="line">  <span class="keyword">var</span> test = <span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'Yup.'</span>);</div><div class="line">  &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
<ul>
<li><code>arguments</code> 不能作为一个参数的名字， 因为这会覆盖每一个函数内的<code>arguments</code>对象。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">nope</span>(<span class="params">name, options, arguments</span>) </span>&#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">yup</span>(<span class="params">name, options, args</span>) </span>&#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="属性"><a href="#属性" class="headerlink" title="属性"></a>属性</h1><ul>
<li><p>访问一个属性时，使用<code>点的形式</code>取值。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> luke = &#123;</div><div class="line">  jedi: <span class="literal">true</span>,</div><div class="line">  age: <span class="number">28</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> isJedi = luke[<span class="string">'jedi'</span>];</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">var</span> isJedi = luke.jedi;</div></pre></td></tr></table></figure>
</li>
<li><p>需要一个变量访问一个属性时，使用“[]”来取值。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> luke = &#123;</div><div class="line">  jedi: <span class="literal">true</span>,</div><div class="line">  age: <span class="number">28</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">getProp</span>(<span class="params">prop</span>) </span>&#123;</div><div class="line">  <span class="keyword">return</span> luke[prop];</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">var</span> isJedi = getProp(<span class="string">'jedi'</span>);</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h1><ul>
<li><p>总是使用 <code>var</code> 来定义变量。如果不这么做将定义一个全局变量出来。我们希望避免全局命名空间的污染。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line">superPower = <span class="keyword">new</span> SuperPower();</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">var</span> superPower = <span class="keyword">new</span> SuperPower();</div></pre></td></tr></table></figure>
</li>
<li><p>使用一个<code>var</code> 声明多个变量，并且每声明一个变量就换一行。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> items = getItems();</div><div class="line"><span class="keyword">var</span> goSportsTeam = <span class="literal">true</span>;</div><div class="line"><span class="keyword">var</span> dragonball = <span class="string">'z'</span>;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">var</span> items = getItems(),</div><div class="line">    goSportsTeam = <span class="literal">true</span>,</div><div class="line">    dragonball = <span class="string">'z'</span>;</div></pre></td></tr></table></figure>
</li>
<li><p>声明多个变量时，把不赋值的变量放在后面。这样做是有好处的，如果日后你想给未赋值变量赋值的时候，可能要引用到上面已经赋值的变量。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> i, len, dragonball,</div><div class="line">    items = getItems(),</div><div class="line">    goSportsTeam = <span class="literal">true</span>;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> i, items = getItems(),</div><div class="line">    dragonball,</div><div class="line">    goSportsTeam = <span class="literal">true</span>,</div><div class="line">    len;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">var</span> items = getItems(),</div><div class="line">    goSportsTeam = <span class="literal">true</span>,</div><div class="line">    dragonball,</div><div class="line">    length,</div><div class="line">    i;</div></pre></td></tr></table></figure>
</li>
<li><p>在一个作用域的顶部给一个变量赋值。这样有助于避开，变量声明和声明提前的分配问题。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  test();</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'doing stuff..'</span>);</div><div class="line"></div><div class="line">  <span class="comment">//..other stuff..</span></div><div class="line"></div><div class="line">  <span class="keyword">var</span> name = getName();</div><div class="line"></div><div class="line">  <span class="keyword">if</span> (name === <span class="string">'test'</span>) &#123;</div><div class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> name = getName();</div><div class="line"></div><div class="line">  test();</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'doing stuff..'</span>);</div><div class="line"></div><div class="line">  <span class="comment">//..other stuff..</span></div><div class="line"></div><div class="line">  <span class="keyword">if</span> (name === <span class="string">'test'</span>) &#123;</div><div class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> name = getName();</div><div class="line"></div><div class="line">  <span class="keyword">if</span> (!<span class="built_in">arguments</span>.length) &#123;</div><div class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">if</span> (!<span class="built_in">arguments</span>.length) &#123;</div><div class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="keyword">var</span> name = getName();</div><div class="line"></div><div class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="声明提前"><a href="#声明提前" class="headerlink" title="声明提前"></a>声明提前</h1><ul>
<li><p>不管你在何处给一个变量声明或赋值，javascript解析器都会事先在作用域的顶端做声明提前（Hoisting）。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 我们知道下面将不能正常运行（假设没有全局变量）</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(notDefined); <span class="comment">// =&gt; 抛出一个引用错误</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 在引用这个变量之后，给这个变量赋值将不会抛异常，这是因为javascript解析器有声明提前。</span></div><div class="line"><span class="comment">// 注意：赋的“true”值，不会被提前。</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(declaredButNotAssigned); <span class="comment">// =&gt; undefined</span></div><div class="line">  <span class="keyword">var</span> declaredButNotAssigned = <span class="literal">true</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// javascript解析器,会在作用域的顶部提前声明变量。</span></div><div class="line"><span class="comment">// 用代码描述出来，其实就等同于下面这种情况。</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> declaredButNotAssigned;</div><div class="line">  <span class="built_in">console</span>.log(declaredButNotAssigned); <span class="comment">// =&gt; undefined</span></div><div class="line">  declaredButNotAssigned = <span class="literal">true</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>匿名函数表达式将该变量名做了提前声明，没有给该变量赋值函数。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(anonymous); <span class="comment">// =&gt; undefined</span></div><div class="line"></div><div class="line">  anonymous(); <span class="comment">// =&gt; 抛出异常，anonymous 不是一个函数</span></div><div class="line"></div><div class="line">  <span class="keyword">var</span> anonymous = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'anonymous function expression'</span>);</div><div class="line">  &#125;;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>和匿名一样，有名函数表达式将该变量名做了提前声明，没有给该变量赋值函数名和函数体。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(named); <span class="comment">// =&gt; undefined</span></div><div class="line"></div><div class="line">  named(); <span class="comment">// =&gt; 抛出异常， named 不是一个函数</span></div><div class="line"></div><div class="line">  superPower(); <span class="comment">// =&gt; 抛出异常， superPower 没定义</span></div><div class="line"></div><div class="line">  <span class="keyword">var</span> named = <span class="function"><span class="keyword">function</span> <span class="title">superPower</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'Flying'</span>);</div><div class="line">  &#125;;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 把函数名改成和变量名一样，也得出同样的结果。</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(named); <span class="comment">// =&gt; undefined</span></div><div class="line"></div><div class="line">  named(); <span class="comment">// =&gt; 抛出异常， named 不是一个函数</span></div><div class="line"></div><div class="line">  <span class="keyword">var</span> named = <span class="function"><span class="keyword">function</span> <span class="title">named</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'named'</span>);</div><div class="line">  &#125;;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>函数声明会将函数名和函数体声明提前。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">example</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  superPower(); <span class="comment">// =&gt; Flying</span></div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">superPower</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'Flying'</span>);</div><div class="line">  &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<p>更多信息请参照<a href="http://www.adequatelygood.com/" target="_blank" rel="external">Ben Cherry</a> 的<a href="http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html" target="_blank" rel="external">JavaScript Scoping &amp; Hoisting</a></p>
<h1 id="条件表达式与等式"><a href="#条件表达式与等式" class="headerlink" title="条件表达式与等式"></a>条件表达式与等式</h1><p>使用 <code>===</code> 和 <code>!==</code> 代替<code>==</code> 和 <code>!=</code></p>
<ul>
<li><p>条件表达式 会通过 ToBoolean 来进行强制转化，而且遵循以下的规则：</p>
<ul>
<li>对象被转化为true</li>
<li>Undefined被转化为false</li>
<li>Null被转化为false</li>
<li>布尔值被转化为相应的布尔值</li>
<li>数字当值为+0,-0或NaN时转化为false，其他的转化为true</li>
<li>Strings类型如果为空时转化为false,否则转化为true<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">if</span> ([<span class="number">0</span>]) &#123;</div><div class="line">  <span class="comment">// true    </span></div><div class="line">  <span class="comment">// 因为数组是对象，对象会被转化为 true</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
</li>
<li><p>使用快捷方式</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">if</span> (name !== <span class="string">''</span>) &#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">if</span> (name) &#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">if</span> (collection.length &gt; <span class="number">0</span>) &#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">if</span> (collection.length) &#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<p>更多的信息 请看<code>Angus Croll</code>的 <a href="">Truth Equality and JavaScript</a></p>
<h1 id="块"><a href="#块" class="headerlink" title="块"></a>块</h1><ul>
<li>给多行的块，使用大括号<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">if</span> (test)</div><div class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">if</span> (test) <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">if</span> (test) &#123;</div><div class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123; <span class="keyword">return</span> <span class="literal">false</span>; &#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h1><ul>
<li><p>使用 <code>/**...*/</code> 进行多行注释。注释要包括描述、指定类型、参数值和返回值。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"></div><div class="line"><span class="comment">// make() returns a new element</span></div><div class="line"><span class="comment">// based on the passed in tag name</span></div><div class="line"><span class="comment">//</span></div><div class="line"><span class="comment">// @param &lt;String&gt; tag</span></div><div class="line"><span class="comment">// @return &lt;Element&gt; element</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">make</span>(<span class="params">tag</span>) </span>&#123;</div><div class="line"></div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line"></div><div class="line">  <span class="keyword">return</span> element;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment"> * make() returns a new element</span></div><div class="line"><span class="comment"> * based on the passed in tag name</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * @param &lt;String&gt; tag</span></div><div class="line"><span class="comment"> * @return &lt;Element&gt; element</span></div><div class="line"><span class="comment"> */</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">make</span>(<span class="params">tag</span>) </span>&#123;</div><div class="line"></div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line"></div><div class="line">  <span class="keyword">return</span> element;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>使用 <code>//</code> 进行单行注释。注释单独占一行，并写在需要注释对象的上面。在注释的上面留一个空行。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> active = <span class="literal">true</span>;  <span class="comment">// is current tab</span></div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="comment">// is current tab</span></div><div class="line"><span class="keyword">var</span> active = <span class="literal">true</span>;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">getType</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'fetching type...'</span>);</div><div class="line">  <span class="comment">// set the default type to 'no type'</span></div><div class="line">  <span class="keyword">var</span> type = <span class="keyword">this</span>._type || <span class="string">'no type'</span>;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> type;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">getType</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'fetching type...'</span>);</div><div class="line"></div><div class="line">  <span class="comment">// set the default type to 'no type'</span></div><div class="line">  <span class="keyword">var</span> type = <span class="keyword">this</span>._type || <span class="string">'no type'</span>;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> type;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<p>给你的代码加前缀，比如<code>FIXME</code>或<code>TODO</code>，这样有助于其他开发者可以迅速理解你指出的需要被处理的问题。<br>如果想更清晰一点你还可以在后面加上描述，比如: <code>FIXME -- need to figure this out</code>或<code>TODO -- need to implement</code>.</p>
<ul>
<li><p>使用 <code>// FIXME</code>: 去注释问题</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">Calculator</span>(<span class="params"></span>) </span>&#123;</div><div class="line"></div><div class="line">  <span class="comment">// <span class="doctag">FIXME:</span> shouldn't use a global here</span></div><div class="line">  total = <span class="number">0</span>;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> <span class="keyword">this</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>使用 <code>// TODO</code>: 来注释解决方法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">Calculator</span>(<span class="params"></span>) </span>&#123;</div><div class="line"></div><div class="line">  <span class="comment">// <span class="doctag">TODO:</span> total should be configurable by an options param</span></div><div class="line">  <span class="keyword">this</span>.total = <span class="number">0</span>;</div><div class="line"></div><div class="line">  <span class="keyword">return</span> <span class="keyword">this</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="空格"><a href="#空格" class="headerlink" title="空格"></a>空格</h1><ul>
<li><p>将<code>tab</code>键设成2个空格</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">∙∙∙∙<span class="keyword">var</span> name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">∙<span class="keyword">var</span> name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">∙∙<span class="keyword">var</span> name;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>逗号/冒号/小括号后面留一个空格</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'test'</span>);</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>) </span>&#123;</div><div class="line">  <span class="built_in">console</span>.log(<span class="string">'test'</span>);</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line">dog.set(<span class="string">'attr'</span>,&#123;</div><div class="line">  age: <span class="string">'1 year'</span>,</div><div class="line">  breed: <span class="string">'Bernese Mountain Dog'</span></div><div class="line">&#125;);</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line">dog.set(<span class="string">'attr'</span>, &#123;</div><div class="line">  age: <span class="string">'1 year'</span>,</div><div class="line">  breed: <span class="string">'Bernese Mountain Dog'</span></div><div class="line">&#125;);</div></pre></td></tr></table></figure>
</li>
<li><p>在文件的最后留一个空行</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params">global</span>) </span>&#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;)(<span class="keyword">this</span>);</div><div class="line"><span class="comment">// 推荐</span></div><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params">global</span>) </span>&#123;</div><div class="line">  <span class="comment">// ...stuff...</span></div><div class="line">&#125;)(<span class="keyword">this</span>);</div></pre></td></tr></table></figure>
</li>
</ul>
<h1 id="逗号"><a href="#逗号" class="headerlink" title="逗号"></a>逗号</h1><ul>
<li>逗号不要前置<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> once</div><div class="line">  , upon</div><div class="line">  , aTime;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">var</span> once,</div><div class="line">    upon,</div><div class="line">    aTime;</div><div class="line"></div><div class="line"><span class="comment">// 不推荐</span></div><div class="line"><span class="keyword">var</span> hero = &#123;</div><div class="line">    firstName: <span class="string">'Bob'</span></div><div class="line">  , <span class="attr">lastName</span>: <span class="string">'Parr'</span></div><div class="line">  , <span class="attr">heroName</span>: <span class="string">'Mr. Incredible'</span></div><div class="line">  , <span class="attr">superPower</span>: <span class="string">'strength'</span></div><div class="line">&#125;;</div><div class="line"></div><div class="line"><span class="comment">// 推荐</span></div><div class="line"><span class="keyword">var</span> hero = &#123;</div><div class="line">  firstName: <span class="string">'Bob'</span>,</div><div class="line">  lastName: <span class="string">'Parr'</span>,</div><div class="line">  heroName: <span class="string">'Mr. Incredible'</span>,</div><div class="line">  superPower: <span class="string">'strength'</span></div><div class="line">&#125;;</div></pre></td></tr></table></figure>
</li>
</ul>
<p>最后一个元素不可以加逗号。这在<code>IE6</code>和<code>IE7</code>还有<code>IE9</code>的怪异模式下出错。</p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;=====================&lt;br&gt;常用的一些javascript规范&lt;/p&gt;
&lt;h1 id=&quot;数据类型&quot;&gt;&lt;a href=&quot;#数据类型&quot; class=&quot;headerlink&quot; title=&quot;数据类型&quot;&gt;&lt;/a&gt;数据类型&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;原始类型
    
    </summary>
    
      <category term="Javascript" scheme="http://yoursite.com/categories/Javascript/"/>
    
    
      <category term="JavaScript" scheme="http://yoursite.com/tags/JavaScript/"/>
    
      <category term="编码规范" scheme="http://yoursite.com/tags/%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83/"/>
    
  </entry>
  
</feed>
