4

除了解析构造函数之外,这两个之间有什么区别吗?

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

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

两者都可以使用

var p = new Person("Yes",25,"Male");

第一个解析为function(),后者解析为person(),但我想知道使用一个比另一个有什么优势

4

1 回答 1

6

就您所说的目的而言,它们是相同的。

唯一的区别在于,在第二个函数内部,您可以从自身内部对函数进行干净的引用。

正式地

语言规范指出

函数表达式:

函数标识符(opt) (FormalParameterListopt) { FunctionBody }

函数表达式中的标识符(在本例Person中)是可选的

稍后在语言规范中解释了其原因:

注意FunctionExpression 中的标识符可以从 FunctionExpression 的 FunctionBody 内部引用,以允许函数递归调用自身。但是,与 FunctionDeclaration 不同,FunctionExpression 中的标识符不能被引用,也不影响包含 FunctionExpression 的范围。

在实践中

您可以在两种情况下使用第二个选项:

当它使您的代码更易于理解时:

   (function removeBodyDivs(){
        //does logic removing
        //divs from the body
   })();

可以比以下更容易理解:

   (function (){
        //does logic removing
        //divs from the body
   })();

例如,在进行递归时

  var f = function fib(n){
      return n<2?2:(fib(n-1)+fib(n-2));
  }
于 2013-05-21T22:25:42.720 回答