构造函数和构造函数文字之间的区别

时间:2015-11-29 02:38:25

标签: javascript

我正在阅读一本JavaScript书籍,这里的构造函数是这样创建的:

var Person = function (living, age, gender) {
    this.living = living;
    this.age = age;
    this.gender = gender;
    this.getGender = function () { return this.gender; };
};

我读到这样的地方:

function Person (living, age, gender) {
    this.living = living;
    this.age = age;
    this.gender = gender;
    this.getGender = function () { return this.gender; };
};

我想知道这两者之间有什么区别。我们创建实例时是否有任何区别,或者它们是否相同,只是创建对象构造函数的两种不同方式?

3 个答案:

答案 0 :(得分:1)

第一个是函数表达式,第二个是函数声明(它最后不需要分号,顺便说一句)。然而,区别与构造函数无关,并且适用于普通函数。

您可能知道,函数是javascript中的一等值。其中一个暗示是可以将函数分配给变量。因此,就像您可以为变量分配数字(例如var pi = 3.14)一样,您可以将函数分配给变量var add = function(a,b) {return a + b}。这是你的第一个声明所做的,它创建一个函数(实现为闭包),然后在变量Person中存储对它的引用。您可以将第二个视为第一个的快捷方式。

有关语法详细信息,请查看规范的§14.1

答案 1 :(得分:0)

两者都相似,您可以使用new Person()从中创建实例。

唯一的区别是,在第一种情况下它是一个表达式,所以它必须在你使用它之前定义,而在第二种情况下,由于提升你可以在文件中的任何地方使用该函数

答案 2 :(得分:-2)

这是在运行时function expression)中定义的:

var Person = function (living, age, gender) {
    this.living = living;
    this.age = age;
    this.gender = gender;
    this.getGender = function () { return this.gender; };
};

这是在解析时间function declaration)中定义的:

function Person (living, age, gender) {
    this.living = living;
    this.age = age;
    this.gender = gender;
    this.getGender = function () { return this.gender; };
};

举个例子:

funA(); // does not work
funB(); // it works

var funA = function(){console.log("testA");}

function funB(){console.log("testB");}

funA(); // it works
funB(); // it works

支持我的答案的其他StackOverflow参考 - > var-functionname-function-vs-function-functionname