2017-07-06 20 views
-5

這是我的代碼片段。爲什麼當函數調用者調用已經存在的對象時會得到'undefined'?

還告訴我什麼是JavaScript引擎的引擎蓋下發生的時候我叫這個代碼

function foo(a){ 
 
     
 
     this.a = a; 
 
     
 
    } 
 

 
    var obj0 ={ 
 
     
 
     foo:foo 
 
    }; 
 

 
    var obj1 ={ 
 
     
 
     foo:foo 
 
    }; 
 

 
    console.log(obj0.foo(5)); // undefined 
 
    console.log(obj1.foo(10)); // undefined

+0

如果你不知道答案,請不要downvote –

+1

foo'return'是什麼? – corn3lius

+0

foo返回變量a =(無論我通過)到對象 –

回答

1

那麼它返回undefined因爲有在

function foo(a) { 
    this.a = a; 
} 
沒有return語句

當您撥打console.log(obj.foo(5))時,您不會實例化新的使用foo作爲構造函數的foo對象,只需將foo作爲常規函數(這裏是obj的方法)調用。

但是,如果您已經實例化了一個您曾使用過的對象:console.log(new obj.foo(5))


調用上obj01作爲參數foo簡單地設置obj0的財產a1,僅此而已。不過,如果你想要的東西要返回你採寫:

function foo(a) { 
    this.a=a; 
    return /*something here*/; 
} 

編輯
你說你叫一個已經存在的對象的構造函數,這在技術上是正確的:你調用函數而不是作爲一個構造函數。構造函數被調用爲關鍵字new的構造函數,然後,只有這樣,纔會返回一個新對象。

你實際上在做什麼只是使用foo作爲這些對象上的a的setter(並且沒有return語句,所以它返回undefined)。

+0

'obj0'已經是一個對象。爲什麼OP需要使用新的關鍵字? – evolutionxbox

+0

@evolutionxbox OP似乎期望'foo'被稱爲構造函數,但他們忘記使用'new' – 4castle

+0

obj0是一個對象,但是您沒有return語句。如果你使用'obj.foo(1)'然後'console.log(obj)',你會看到obj有一個屬性'a',它的值爲'1' – Vivick

相關問題