Javascript中var引發的問題
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這個在線工具中,我們可以看到下面的報告:
這個報告說明了源碼中的那些變量的情況。