javascript - 构造函数定义的差异

标签 javascript

<分区>

Possible Duplicate:
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 真的很陌生,我想知道是否有某种形式是错误的,以及是否有一些最佳实践可以遵循。

最佳答案

就构造函数而言没有区别。 JavaScript 中的所有函数都可以作为构造函数调用(它们是否抛出错误完全是另一回事)。

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

第一个声明是一个需要执行的变量。第二个声明作为提升的函数。

JavaScript 中的

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

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

实际上是:

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

函数的 react 相似:

(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!');
  }
}());

关于javascript - 构造函数定义的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826534/

相关文章:

javascript - 尝试从数组中选择一个随机索引 - 总是给我数组的最后一个索引

javascript - 无法让 Firebase update() 使用提供的对象

javascript - Owl Carousel 2 - 自动高度(多项)

javascript - 使用 Javascript Overlay 的 GWT RPC 或 Request Builder?

javascript - iFrame 的固定宽度为 300px,没有任何样式定义 300px

javascript - 如何有效地连接 Uint8Array?

javascript - Jquery(输入/文本区域).val() : how is it adding content without changing the DOM?

javascript - 如何在搜索结果中只选择可见元素

javascript - 使用特定类的链接填充 javascript 数组

javascript - 单个重复元素上的​​ JS mouseOver(具有多个类选择器)