Javascript 中的 var

jopen 9年前
   <p>        MelonCard 发布了一篇文章——”<a href="/misc/goto?guid=4958341267817823848" target="_blank">how one missing var ruined our launch</a>“(” 少写了一个 var 毁了我的网站”),这篇文章是说 MelonCard 用 Node.js 做后台,因为出了一个小高峰——有 50-100人注册,结果整个网站都不响应了,而且还出现了很多奇怪的问题。当他们调查到问题的要源的时候,他们发现下面的代码少写了一个 var。</p>    <div class="cnblogs_code">    <pre>app.all (‘/apps/:user_id/status’, function (req, res, next) {      <span style="color:#008000;">//</span><span style="color:#008000;"> …</span><span style="color:#008000;"> </span>    initial = extractVariables (req.body);  });</pre>   </div>    <p>        为什么 inital 少写一个 var 会引发这个问题呢?因为如果你不写 var,这个局部的变量会被 javascript 当成全局变量,而这个变量又是一个函数,所以,当多用户并发的时候,这个本应该在不同用户下互不干扰的变量,成了各个用户共享的东西。试想,用户A的数据 被用户B覆盖了,用户A和B的数据还没处理完,结果被新的C给搞乱了,程序的逻辑自然出现了问题。</p>    <p>        在 stackoverflow.com 上有<a href="/misc/goto?guid=4958341268609439404" target="_blank">这么一个贴子说明了“有 var”和“无 var”</a>的差别:</p>    <pre class="brush:javascript; toolbar: true; auto-links: false;">// These are both globals  var foo = 1;  bar = 2;     function test ()  {      var foo = 1; // Local      bar = 2;     // Global         // Execute an anonymous function      (function()      {          var wibble = 1; // Local          foo = 2; // Inherits from scope above (creating a closure)          moo = 3; // Global      }())  }</pre>    <p>        上面这个示例告诉我们,如果你不用 var,那么这个 js 引擎会一层一层地向上找父作用域中的变量,如果找到了,就用,如果找不到了,就会帮你定义一个全局的变量。上面这个例子充分说明了这一点。所以,如果你想 在当前的作用域用声明变量,你一定要用 var。这对于一些乱写 javascript 代码的程序员要注意了。这里再给大家介绍一个工具——</p>    <p>        <strong>JSLint ( <a href="/misc/goto?guid=4958340820821384270">http://www.jslint.com/</a> )</strong>,一个 JS 代码质量的分析工具,我们把上述 stackoverflow 的代码 copy 到 JSLint 这个在线工具中,我们可以看到下面的报告:</p>    <p style="text-align:center;"><img title="jslint" alt="Javascript 中的 var" src="https://simg.open-open.com/show/5f27b31179dc1ad1389dc530e9b4563c.jpg" width="500" height="184" /></p>    <p>        这个报告说明了源码中的那些变量的情况。<br /> <br /> 来自: <a id="link_source2" href="/misc/goto?guid=4958341270151659768" target="_blank">coolshell.cn</a></p>