2016-10-31 101 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'语句。只有在使用单语句版本时才是自动的。 –