2009-12-17 348 views
0

我在javascript中有一個小問題。 這裏是一個聲明:在Javascript中調用函數對象

function answerToLifeUniverseAndEverything() 
    { 
     return 42; 
    } 

    var myLife = answerToLifeUniverseAndEverything(); 

如果我做console.log(myLife) 這將打印42,因爲我只是調用的功能,導致42爲答案相同的實例。對,如果我做

var myLife = new answerToLifeUniverseAndEverything(); 

那麼我就不能調用函數另一方面(在JavaScript的,只有對象的引用傳遞基本規則,而不是對象)

現在;相反,myLife只是一個對象?我知道這是同一個函數對象的新副本,而不是引用;但爲什麼我不能調用該方法?

請你澄清我在這裏失蹤的基本根本嗎?

乾杯

回答

3

通過前綴調用answerToLifeUniverseAndEverything()new你告訴JavaScript來調用函數爲constructor function,類似的(內部),以這樣的:

var newInstance = {}; 
var obj = answerToLifeUniverseAndEverything.call(newInstance); // returs 42 
if (typeof obj === 'object') { 
    return obj 
} else { 
    return newInstance; 
} 

JavaScript繼續初始化構造函數中的this變量以指向answerToLifeUniverseAndEverything的新實例。除非您自己返回不同的Object,否則無論您是否喜歡,這個新實例都會返回

+0

不一樣,你可以返回一個函數。 – IllidanS4 2015-07-12 23:33:18

1

嘗試:

function answerToLifeUniverseAndEverything() { 
    return 42; 
} 

var myLife = answerToLifeUniverseAndEverything; 

alert(myLife()); 

當你這樣做:

var myLife = answerToLifeUniverseAndEverything(); 

你分配功能結果myLife即42

1

我想我已經描述了的行爲3210其他地方。基本上,當你做new f()時,JS引擎創建一個對象並將其作爲this傳遞,如果返回值f()不是對象,則使用該對象。

例如。

o = new f(); 

相當於(約),以

temp = {}; 
temp2 = f.call(temp); 
o = typeof temp2 === "object" ? temp2 : temp; 
1

如果我做console.log(myLife)這將打印42,因爲我只是調用的功能,導致42爲答案相同的實例。 (只傳遞對象的引用而不是對象的基本規則)

不完全。這是因爲您將answerToLifeUniverseAndEverything()的返回值分配給myLife。如果你想使功能的拷貝,刪除括號:

var myLife = answerToLifeUniverseAndEverything; 
console.log(myLife()); 
3

當你這樣做var myLife = answerToLifeUniverseAndEverything();,MYLIFE僅僅是保持從函數調用的返回值 - 在這種情況下,42 myLife一無所知在這種情況下你的函數,因爲該函數已經調用,返回,然後它將結果值(42)分配給新變量myLife

當你做一個完全不同的事情var myLife = new answerToLifeUniverseAndEverything(); - 而是創建一個新的對象,傳遞給函數this,然後(假設函數不返回一個對象本身),存儲在新創建的變量。由於你的函數返回一個數字,而不是一個對象,所以新生成的對象被存儲。

相關問題