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

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

相反,你thislogText()方法加上前缀,就可以了。不会弹出错误消息。

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

我实在想不通原因。

4

4 回答 4

4

您需要学习 JavaScript 范围规则。这篇博文给出了很好的介绍

简而言之,当你使用变量名时,JavaScript 遵循一些规则(为了解释的目的,函数定义很像变量声明)。

可能让你感到困惑的是:

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

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

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

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

于 2012-08-02T07:25:57.450 回答
0

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

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

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

于 2012-08-02T07:18:13.727 回答
0

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

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

于 2012-08-02T07:18:54.473 回答
0

打电话

logText();

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

于 2012-08-02T07:24:53.813 回答