构造函数定义的差异

时间:2012-10-10 19:05:59

标签: javascript

  

可能重复:
  JavaScript: var functionName = function() {} vs function functionName() {}

我想知道以下两个构造函数之间是否存在一些隐藏的区别:

var Person = function(name){
     this.say=function(){
         console.log(name);
     }
}

和这一个:

function Person(name){
         this.say=function(){
             console.log(name);
         }
  }

假设我们总是写:

var x = new Person('xxxxx');
x.say();

对我来说似乎是一样的,但我在javascript中真的很绿,我想知道某些形式是否错误以及是否有一些最佳实践要遵循。

1 个答案:

答案 0 :(得分:4)

就构造函数而言,没有区别。 JavaScript中的所有函数都可以作为构造函数调用(无论它们是否抛出错误都是完全不同的问题)。

区别在于声明函数的方式。

第一个声明是一个需要执行的变量。第二个声明是一个悬挂的功能。

JavaScript中的

var foofunction foo语句将被提升到其结束范围的顶部(最近的function父级)。这意味着:

(function () { //closure for scope
  doStuff();
  var foo = bar;
}());

实际上是:

(function () {
  var foo;
  doStuff();
  foo = bar;
}());

功能反应相似:

(function () {
  doStuff();
  function foo() {
    bar = baz;
  }
}());

与:

相同
(function () {
  function foo() {
    bar = baz;
  }
  doStuff();
}());

这种区别很重要,因为变量中声明的函数在声明之后才能被访问:

(function () {
  foo(); //this doesn't work and will result in an error
  var foo = function () {
    alert('works');
  };
}());

虽然函数可以访问,只要它在范围内的某个位置:

(function () {
  foo(); //works!
  function foo() {
    alert('works!');
  }
}());