1

重複の可能性:
JavaScript: var functionName = function() {} vs function functionName() {}

次の 2 つのコンストラクター関数の間に隠れた違いがあるかどうかを知りたいです。

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に慣れていないので、フォームが間違っているかどうか、従うべきベストプラクティスがあるかどうかを知りたいです.

4

1 に答える 1

4

コンストラクタに関する限り、違いはありません。JavaScript のすべての関数はコンストラクターとして呼び出すことができます (エラーをスローするかどうかはまったく別の問題です)。

違いは、関数の宣言方法です。

最初の宣言は、実行が必要な変数としてのものです。2 番目の宣言は、ホイストされる関数としてのものです。

var fooJavaScriptのfunction 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!');
  }
}());
于 2012-10-10T19:08:43.340 に答える