在JavaScript中调用类似属性的函数?

时间:2014-02-10 00:56:30

标签: javascript

我在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'用作变量或属性,而不是真正的函数。有人能说清楚为什么会这样吗?

2 个答案:

答案 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));

Demo

首先创建一个函数并保存在名为isEven的变量中,然后我们将函数传递给Array.filter,以防万一将每个元素传递到该数组并返回一个只包含元素的数组isEven已返回true