我从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 ++背景,所以你可以理解这对我来说有多么令人惊讶。
欢迎任何想法。
答案 0 :(得分:2)
person.calculateAge
和person.greet
之间没有区别,因为两者都会作为属性添加到“#1}”和“{1}}之间。宾语。然而,作者试图解释' this
'在不同的执行上下文中设置关键字,这通常不依赖于函数的定义位置,而是取决于函数的调用方式。
在上述this
' person
'关键字将设置为' yearsOld()
'对象,因为这些方法是由人员调用的。然而,在调用person.calculateAge
方法时,它将不再指向“人”#39;对象,因为this
正在调用它
我建议您查看Mozilla Dev link以了解' {{1}}'。
答案 1 :(得分:2)
我将为您提供一个简单的示例,它将区分方法调用和函数调用。
var x = 3;
var foo = {
x: 2,
baz: {
x: 1,
bar: function() {
return this.x;
}
}
}
var go = foo.baz.bar;
alert(go());//3
alert(foo.baz.bar());//1
当你调用方法inovcation'this'绑定到当前对象时,当你调用函数调用模式'this'绑定到全局对象时。以上示例将简单地向您解释所有阅读过的内容。
在您的示例中,两者都是方法调用模式。
答案 2 :(得分:0)
猜猜你是如何考虑这个例子的。
如果您在考虑,person.greet();
是方法调用,person.calculateAge(10);
是函数调用,那么您的方法调用都是错误的。
我认为,在第二种方法calculateAge
中,调用yearsOld
的方式是函数调用模式。
对于JS阅读正确的东西更重要。看看this。
这是一个函数调用模式:
var sum = add(3, 4); // sum is 7
由于add
方法不是任何对象的一部分,例如我们正在考虑的yearsOld
函数。
答案 3 :(得分:0)
好吧!尽管我是javascript新手,但这个问题确实很老。但是我在写这个答案是为了帮助新人们寻找答案。
当您将函数声明为对象的一部分时,此关键字的上下文将保留到当前对象的上下文,因此称为 方法调用 < / strong>,但是当您在先前声明的函数中声明另一个函数时,此新函数的 this 关键字将使用全局上下文,因为它是任何非箭头函数的属性。具有全局上下文的此功能将被视为 功能调用 。
在上面给出的示例中,函数 greet 和 calculateAge 在方法调用下,而函数 yearsOld 在函数调用下。
有关此链接的参考信息,请查看:https://www.geeksforgeeks.org/arrow-functions-in-javascript/