javascript - 为什么调用对象内部的函数需要 "this"

标签 javascript

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();
    }
};

实在想不通原因。

最佳答案

您需要学习 JavaScript 作用域规则。 This blog post gives a good introduction .

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

可能让您感到困惑的是:

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

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

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

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

关于javascript - 为什么调用对象内部的函数需要 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11772679/

相关文章:

javascript - 搜索数据表

javascript - ViewController 和 Enyo

javascript - 为什么我的可搜索过滤列表不起作用?

javascript - 使用javascript,根据值删除除最后一个对象之外的所有对象

javascript - Promise 链(angular javascript)

javascript - 如何使用 raphael js 添加额外的路径箭头到指针路径

javascript - ReactJS - 类型错误 : Cannot set property 'propOne' of undefined

javascript - 如果动态插入html,如何获取div标签的高度?

javascript - Django 通过上下文动态显示表单域

javascript - AngularJS + Socket.io : Socket events triggering modal—inside a directive or controller?