2016-10-31 126 views
-1

我開始學習ES6 &寫了這個代碼:爲什麼這段代碼總是返回undefined?

let dog = { 
 
     s:'Woff', 
 
     talk:()=>{console.log(this.s)} 
 
    }; 
 
    dog.talk(); 
 
    let x = dog.talk; 
 
    x(); 
 
    x.bind(dog)();

爲什麼它總是返回undefined,而不是 'WOFF'?我認爲只有1行返回undefined,但我們有3個未定義。

+1

console.log返回未定義。 –

+0

1.您沒有任何'return'語句,並且2.您的console.log(console.log(...))' – crashmstr

+0

@JaredSmith剛剛檢查過文檔,並且因爲他有'{}'' (塊體)他需要一個回報,據我所知:[箭頭函數](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) – crashmstr

回答

6

您將「talk」屬性值定義爲箭頭函數,這意味着該函數中的this的值將是函數定義上下文中this的值。這是不是「狗」的對象,它是什麼thislet聲明出現的地方。

如果使用常規的功能,而不是,你的代碼將作爲你希望:現在

let dog = { 
    s:'Woff', 
    talk: function(){ console.log(this.s); } 
}; 
console.log(dog.talk()); 

,在this問題之上,你的「對話」功能不返回任何東西,所以傳遞調用函數的結果將始終返回undefined。 (在箭頭函數版本中,有本來可以是一個返回值,如果它已經是一個單語句的無支撐函數體,但它會undefined因爲console.log()不會返回任何東西。)所以:

let dog = { 
    s:'Woff', 
    talk: function(){ console.log(this.s); return this.s; } 
}; 
console.log(dog.talk()); 

現在你可以在功能看「WOFF」從console.log(),也從外console.log()

+0

我仍然不認爲這是完全正確的。 'console.log'不返回一個值。它輸出一個字符串,因此什麼都不返回。因此,輸出'console.log'的返回值將導致'undefined'。 – Brandon

+0

@Brandon是的,同意;我不得不弄清楚我是怎麼想解釋的:)答案更新。 – Pointy

+1

具有'{}'的箭頭函數需要'return'語句。只有在使用單語句版本時纔是自動的。 –