javascript - 方法与函数调用模式

标签 javascript

我从 taylormcgann 中选取了这个示例.在我问我的问题之前,让我声明我是 JavaScript 的新手并且很难理解这些概念。

在我提到的链接中,方法调用模式是这样定义的:

var person = {
    name: 'Calvin',
    age: 25,
    greet: function () {
        alert('My name is ' + this.name + '.');
    }
};
person.greet(); //My name is Calvin.

很公平。 greet() 被定义为一个方法,并被这样访问。现在是函数调用模式:

// Add a new method to person
person.calculateAge = function (yearsFromNow) {
    var self = this;

    function yearsOld() {
        return self.age + yearsFromNow;
    }

    alert('I will be ' + yearsOld() + ' years old ' + yearsFromNow + ' years from now.');
}
person.calculateAge(10); //I will be 35 years old 10 years from now.

我无法理解这究竟是如何成为函数调用的?我可以测试并验证 this 对象引用 window,但调用语法与上面相同。这真的是方法和函数调用模式之间的区别吗,一种是在对象内部定义的,另一种是在某种程度上在外部定义的?我来自 C/C++ 背景,所以你可以理解这对我来说有多么令人惊讶。

欢迎提出任何想法。

最佳答案

person.calculateAgeperson.greet 之间没有区别,因为两者都将作为属性添加到“person”对象。然而,作者试图解释如何在不同的执行上下文中设置“this”关键字,这通常不取决于函数定义的位置,而是取决于函数的调用方式。
在上述两种情况下,“this”关键字都将设置为“person”对象,因为这些方法由“person”调用。然而,在调用 yearsOld() 方法时,它将不再指向 'person' 对象,因为它被 person.calculateAge 调用。
我建议看看 Mozilla Dev link理解“this”。

关于javascript - 方法与函数调用模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27099149/

相关文章:

javascript - 使用 D3 创建网络 map

javascript - 在 JavaScript 中将数组保存到 cookies

javascript - 如何在 Sequelize JS 和 PostgreSQL 中的 1 :M relationship when implementing with . bulkCreate() 中使用外键

javascript - 从 MYSQL 到 jquery FLOT 的图表

javascript - 复选框触发更改事件

javascript - 水平对齐 div 无限高

javascript - 如何在 Controller 中使用 ocLazyLoad 依赖注入(inject)?

javascript - 下拉菜单仅适用于 Chrome

javascript - Rails Controller 不接受 JSON?

javascript - 如何在angular js中 trim 字符串中的字符