2014年7月16日 星期三

【javascript】var 與 不var的差別

先前看到有人在一個論壇上po了這個問題


請問:有var跟沒var應用上的差別?謝謝
菜鳥提問:
一.
var one = function () {
    return "one";
};


二.
function one () {
    return "one";
};


請問使用上一跟二,會有什麼差別呢
菜鳥再此感謝


------------------------------------------

心寫來潮寫了這篇文章



從他的提問,結果上來說是沒有分別的,但實際上還是有分別:

先簡單說一下javascript的預編譯。
當瀏覽器載入js之後,會先對js的程式做一下預編譯
當你程式是這樣:
if("a" in window){
    var a = 123;
}
alert(a);


你猜猜結果會是什麼?


結果會alert 123 出來,這是寫程式邏輯與編譯邏輯有稍微的不同
js引擘會將變數預先宣告在函數的開頭
上列的範例會變成:
var a;//這行實際意味:window.a = undefined; 與null不同

if("a" in window){ //a存在於window,true
    a = 123;//window.a = 123;
}
alert(a);//window.alert( window.a );
好這跟問題有什麼關係? 有一點點的關係。 當使用
function a(){
}
無疑的是宣告 a這個函數,但預編譯的情況下,會直接將 a 賦值 簡單範例一下:
alert(a());
function a(){
     return 1;
}
結果會alert 1
實際的情況:
var a;
a = function a(){return 1;}
alert(a());
那來複雜的
a();
var a = function(){alert("1")}
function a(){alert("2")}
a();
結果是會是:先出現2 再出現1

分析實際情況:
var a;
a = function a(){alert("2")}
a();
a =  function(){alert("1")}
a();

最後回到問題:
一.
var one = function () {
    return "one";
};
二.
function one () { 
    return "one";
};
請問使用上一跟二,會有什麼差別呢

這個答案具體要看情況



PS:補充一點
var one = function(){}
這個是暱名函數
function one(){}
這個是具名函數

這兩者的不同我就不在這邊說明了
但你可以用.toString() 來看看他們有什麼不同的地方