1.function a(){}javascript
該方法的定義是全局性的,就算在調用以後定義,系統也不會報錯,能夠理解爲,系統在執行到該方法時再去找該方法的定義位置進行初始化。java
2.var a=function(){}數組
匿名函數的定義方法,如果在定義以前調用了,系統會報錯。能夠理解爲,只用運行到這個方法時才能對變量a進行初始化,如果沒有對變量a初始化,則會報錯。此時,a表明後面匿名函數的返回值。函數
3.var a=new function(){}對象
在javascript中,方法被看成一個類來處理,這中定義方式下,a即帶表了這個方法的類,也就是這個方法自己。ip
可是有一種特殊狀況,如果在該方法中,返回值爲數組、方法、或是別的類,那麼a不在表示該方法,而是表示返回的新類了。string
情景一:
var a = new function() {return "圓心"};
alert(a);
咱們運行情景一代碼,將返回顯示「[object object] 」,此時該代碼等價於:
function x(){
return "圓心";
}
var a = new x();
alert(a);咱們對情景一的代碼進行下面改造:
var a = new function() {return new String("圓心")};
alert(a);
咱們運行,將會發現返回的是「圓心」,這是爲何呢?
只要 new 表達式以後返回(return)一個引用對象(數組,對象,函數等),都將覆蓋new建立的匿名對象,若是返回(return)一個原始類型(無 return 時其實爲 return 原始類型 undefined),那麼就返回 new 建立的匿名對象
因爲 new String 會構造一個對象,而不是一個 string 直接量,且new String(x) 若是帶參數,那麼alert它的時候就會返回 x。因此 yx01 將返回 new String(」圓心」) 這個對象,而 alert yx01 則顯示 「圓心」。
情景二:
var a = function() {return "圓心"}();
alert(a);咱們運行情景二代碼,將返回顯示「圓心」,此時該代碼等價於:
var x = function() {return "圓心"};
a = x();
alert(a);很明顯,yx02 返回的是匿名函數的執行結果值,即 yx02 爲:「圓心」。
io