【问题标题】:Why is "this" needed to call functions inside an object为什么需要“this”来调用对象内部的函数
【发布时间】:2012-08-02 07:13:14
【问题描述】:
var a = {
    text : 3,
    logText : function () {
        console.log(this.text);
    },
    callLogText : function() {
        logText();
    }
};
a.callLogText();

这将生成ReferenceError: logText is not defined 错误消息。

相反,您将this 前缀到logText() 方法,就可以了。不会弹出任何错误消息。

var a = {
    text : 3,
    logText : function () {
        console.log(this.text);
    },
    callLogText : function() {
        this.logText();
    }
};

我实在想不通。

【问题讨论】:

  • 我认为您没有向我们展示所有代码。我在任何地方都没有看到barral
  • 它与范围有关。 this指的是var a,如果不使用this,它会寻找一个名为logText的全局函数。

标签: javascript


【解决方案1】:

您需要学习 JavaScript 范围规则。 This blog post gives a good introduction.

简而言之,当您使用变量名时,JavaScript 遵循一些规则(出于解释的目的,函数定义非常类似于变量声明)。

你可能会感到困惑的是:

var a = { b: ...};
var a = function() { var b = ... }

在这两种情况下,您都会得到一个新变量a。在第一种情况下,它是一个具有 property b 的对象。在第二种情况下,它是一个具有嵌套范围的函数,其中定义了一个新变量b

JavaScript 将在当前和所有父作用域中查找变量。但是对象定义不是范围。就 JavaScript 而言,属性 b 是不可见的,除非您使用特殊变量 this 使其可见,该变量始终引用“当前”对象(在您的示例中,即 a)。

由于对象a 的属性不在“范围内”,JavaScript 无法找到logText(),除非您告诉它查找this。如果你什么都不说,JavaScript 会先查看当前作用域(函数callLogText 的主体),然后是父作用域(其中定义了a),然后是它的任何父作用域。

【讨论】:

【解决方案2】:

这不是一个怪癖。当涉及到对象时,这就是大多数语言的功能。

logText()a 对象的方法,而不是函数。

您需要在内部以this.methodName() 或在外部以object.methodName() 调用方法。

【讨论】:

    【解决方案3】:

    logText(); 是执行一个未定义的全局函数logText

    this.logText();是执行函数a.logText

    【讨论】:

      【解决方案4】:

      打电话

      logText();
      

      表示某处有一个名为 logText() 的函数,但在这里您已将 logText() 定义为对象的属性,因此要访问 logText(),您必须借助它定义的对象来引用它in. 在这种情况下,它位于同一个对象中,因此您可以通过说 this 来引用同一个对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 2012-02-20
        • 2021-01-23
        相关资源
        最近更新 更多