Javascript 中的 var

jopen 12年前發布 | 23K 次閱讀 JavaScript

        MelonCard 發布了一篇文章——”how one missing var ruined our launch“(” 少寫了一個 var 毀了我的網站”),這篇文章是說 MelonCard 用 Node.js 做后臺,因為出了一個小高峰——有 50-100人注冊,結果整個網站都不響應了,而且還出現了很多奇怪的問題。當他們調查到問題的要源的時候,他們發現下面的代碼少寫了一個 var。

app.all (‘/apps/:user_id/status’, function (req, res, next) {
    //     initial = extractVariables (req.body);
});

        為什么 inital 少寫一個 var 會引發這個問題呢?因為如果你不寫 var,這個局部的變量會被 javascript 當成全局變量,而這個變量又是一個函數,所以,當多用戶并發的時候,這個本應該在不同用戶下互不干擾的變量,成了各個用戶共享的東西。試想,用戶A的數據 被用戶B覆蓋了,用戶A和B的數據還沒處理完,結果被新的C給搞亂了,程序的邏輯自然出現了問題。

        在 stackoverflow.com 上有這么一個貼子說明了“有 var”和“無 var”的差別:

// 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
    }())
}

        上面這個示例告訴我們,如果你不用 var,那么這個 js 引擎會一層一層地向上找父作用域中的變量,如果找到了,就用,如果找不到了,就會幫你定義一個全局的變量。上面這個例子充分說明了這一點。所以,如果你想 在當前的作用域用聲明變量,你一定要用 var。這對于一些亂寫 javascript 代碼的程序員要注意了。這里再給大家介紹一個工具——

        JSLint ( http://www.jslint.com/ ),一個 JS 代碼質量的分析工具,我們把上述 stackoverflow 的代碼 copy 到 JSLint 這個在線工具中,我們可以看到下面的報告:

Javascript 中的 var

        這個報告說明了源碼中的那些變量的情況。

來自: coolshell.cn

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!