我在JavaScript的MDN(Mozilla开发者网络)教程中遇到了这段代码(顺便说一下,这是一篇精彩的阅读)。 MDN JavaScript Re-introduction
function personFullName() {
return this.first + ' ' + this.last;
}
function personFullNameReversed() {
return this.last + ', ' + this.first;
}
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = personFullName;
this.fullNameReversed = personFullNameReversed;
}
引起我兴趣的是调用函数的方式。典型的();不用于在Person函数中进行函数调用。在Person函数中,我们看到:
this.fullName = personFullName;
使用代替
this.fullName = personFullName();
这里,'personFullName'用作变量或属性,而不是真正的函数。有人能说清楚为什么会这样吗?
答案 0 :(得分:1)
JavaScript是一种函数式语言,函数是一等值。它们只是对象,可以像任何其他对象一样保存自定义属性。对它们的引用可以自由传递,这允许大量的cool stuff(你可能会在以后学习)。
所以这里发生的是函数确实没有被调用,它们通过包含它们的变量引用,并被赋值为实例的属性(this
)。
与第一个使用对象的示例(makePerson
)类似,现在可以在每个实例上将它们作为方法调用:
var s = new Person("Simon", "Willison");
s.fullName(); // Simon Willison
随附的文字也解释了这一点:
每次我们创建一个人物对象时,我们都会创建两个全新的对象 其中的函数对象 - 如果这个代码是不是更好 共享?
[现在你引用的代码更好]:我们正在创建方法 只运行一次,并在其中分配对它们的引用 构造
答案 1 :(得分:1)
运行函数Person
时不调用函数,只传递引用。
JavaScript具有一等公民的功能,这意味着函数就像其他所有对象一样:它们可以具有属性,可以保存在变量中,可以作为参数传递等。
这允许一些真正富有表现力的代码,看看这个:
function isEven(item) {
return item % 2 == 0;
}
alert([1, 2, 3, 4, 5, 6].filter(isEven));
首先创建一个函数并保存在名为isEven
的变量中,然后我们将函数传递给Array.filter
,以防万一将每个元素传递到该数组并返回一个只包含元素的数组isEven
已返回true
。