JS中var a=new function(){}與var a=function(){}與function a(){}的區別

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

相關文章
相關標籤/搜索