JavaScript變數聲明那些事兒,javascript變數聲明
聲明和初始化不一樣
聲明
var joe; // the declaration
初始化
joe = ‘plumber’; // the initialization
聲明前置
你可以在函數的任何位置通過var聲明變數,它們會像是在函數頂部聲明一樣發揮作用,這種行為稱為 hoisting(前置/置頂解析/預解析)。當你使用了一個變數,然後不久在函數中又重新聲明的話,就可能產生邏輯錯誤。看下面這個例子:
var myname = "global";(function() { alert(myname); var myname = "local"; alert(myname);})();
在這個例子中,你可能會以為第一個alert彈出的是”global“,第二個彈出”local”。這種期許是可以理解的,因為在第一個alert 的時候,myname未聲明,此時函數肯定很自然而然地看全域變數myname,但是,實際上並不是這麼工作的。第一個alert會彈出”undefined“,因為myname被當做了函數的局部變數(儘管是之後聲明的),所有的變數聲明都被前置到函數的頂部了。因此,為了避免這種混亂,最好是預先聲明你想使用的全部變數。
上面的程式碼片段執行的行為會像下面這樣:
var myname = "global";(function() { var myname; alert(myname); myname = "local"; alert(myname);})();
忘記var的副作用
由於JavaScript的兩個特徵,不自覺地建立出全域變數是出乎意料的容易。首先,你甚至可以不需要聲明就可以使用變數;第二,JavaScript有隱含的全域概念,意味著你不聲明的任何變數都會成為一個全域對象屬性。看下面的代碼:
function sum(x, y) { result = x + y; result;}sum(1, 3);alert(result);
此段代碼中函數範圍外的 result 沒有聲明,代碼照樣運作正常,alert會彈出4。如果函數變數內不使用var,會產生一個全域變數,這就是忘記var的副作用(Side Effects When Forgetting var)。因此,要想和其他指令碼成為好鄰居的話,儘可能少的使用全域變數是很重要的。
想讓全域變數少最重要的還是始終使用var來聲明變數。