【问题标题】:Why this code return always undefined? [duplicate]为什么这段代码总是返回未定义? [复制]
【发布时间】:2016-10-31 12:44:33
【问题描述】:

我开始学习 ES6 并编写了这段代码:

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

为什么它总是返回 undefined 而不是 'Woff' ?我认为只有 1 行返回 undefined 但我们有 3 undefined 。

【问题讨论】:

  • console.log 返回未定义。
  • 1.你这里没有任何return 语句,2. 你console.log(console.log(...))
  • @JaredSmith 刚刚检查了文档,因为他有{}(块体),据我所知,他需要一个回报:Arrow functions
  • 我认为每个人都对这里“返回”这个词的使用读得太多了……stackoverflow.com/q/33723263/476 是一个非常好的复制品。
  • @CodingIntrigue 在 FunctionBody 下:var func = (x, y) => { return x + y; }; // with block body, explicit "return" needed

标签: javascript ecmascript-6


【解决方案1】:

您将“talk”属性值定义为箭头函数,这意味着该函数中this 的值将是函数定义上下文中this 的值。这不是“狗”对象,它是thislet 语句出现的位置。

如果您改用常规函数,您的代码将按预期工作:

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

现在,除了this 问题之外,您的“talk”函数不会返回任何内容,因此将调用结果传递给该函数将始终返回undefined。 (在箭头函数版本中,如果 was 是单语句无括号函数体,则它可能是一个返回值,但它 是 @987654328 @ 因为console.log() 没有返回任何东西。)所以:

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

现在您将在函数中看到来自 console.log() 的“Woff”,以及来自外部 console.log() 的“Woff”。

【讨论】:

  • 我仍然认为这也不完全正确。 console.log 不返回值。它输出一个字符串,因此什么也不返回。因此,输出console.log 的返回值将导致undefined
  • @Brandon 是的,同意;我必须弄清楚我想如何解释:) 答案已更新。
  • 带有{} 的箭头函数需要return 语句。仅当您使用单语句版本时它是自动的。
  • @JF 哦,你是对的;原代码我看错了。
  • @JF 他们“需要”return 声明当且仅当你想返回一些东西......
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2015-03-16
  • 2016-04-18
  • 2017-05-19
  • 2017-12-25
相关资源
最近更新 更多