【问题标题】:Why is the "this" keyword is not referring to the state I'd set?为什么“this”关键字不是指我设置的状态?
【发布时间】:2018-05-15 20:42:28
【问题描述】:

我昨天开始学习 JavaScript,今天我在学习对象和函数。

我已经完成了这项工作,但我真的很怀疑为什么在 dog1 对象中,如果我使用 this 关键字,我只会在日志中返回“未定义”。

我已经在这里和谷歌上搜索过这个,但没有运气。我不是在寻找解决此问题的代码,只是为了了解为什么在第二种情况下“this”不起作用。

 var dog0 = {
     Name: "Bob",
     color: "Golden",
     breed: "Labrador",
     dogcard1: function() {
        return  "Hi, this is " + this.Name + ", a " + this.color + " " + this.breed ;
     }
 };

 console.log(dog0.dogcard1());


function dogcard(a, b, c) {
    return  "Hi, this is " + a + ", a " + b + " " + c ;
 }

var dog1 = new Object();
dog1.Name = "Suzy";
dog1.color = "black";
dog1.breed = "Bulldog";
dog1.presentation = dogcard(this.Name, dog1.color, dog1.breed);
console.log(dog1.presentation);

【问题讨论】:

  • 这是java吗???
  • 您在这里谈论的是 JavaScript。 Java 之于 JavaScript,就像汽车之于地毯一样。
  • 因为this 不是指您认为的内容
  • @Cam 我什至不确定这是一个骗子,JavaScript 中的this 可能会令人困惑,但在这种情况下,它甚至不是 JS 的怪事。他甚至没有在函数内部调用this。那么OP还能认为this是什么......?

标签: javascript object this


【解决方案1】:

undefined 返回的原因是 JavaScript 不知道 Name 的来源。

在 JavaScript 中,您可以依赖三个作用域:

  • 块范围(用于 if 语句、对象声明和循环),
  • 功能范围,以及
  • 全局范围(如果没有其他范围的保护,所有内容都将被提升到该范围内)。

如果您调用this,您可能会看到它附加到Window,这实际上是全局空间。你没有在那里声明Name,这很有意义。

在您的dog1 对象内部,您拥有引用直接封闭对象所需的范围,因此this 适用。不过,我仍然不鼓励这种特定用途 - 个人喜好 - 而是将值传递进去,以便清楚地知道所有内容的来源。

可能打算使用 dog1 而不是 this 来表示该特定变量,所以我鼓励您更正那个错字。

【讨论】:

  • 感谢您的回答,@Makoto。这不是一个错字,我这样做是为了表明即使在 dog1 对象中,关键字也会返回 undefined,所以它会适用。
【解决方案2】:

如果你在严格模式下,如果执行上下文没有定义它,它仍然是“未定义的”。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多