4

なぜ私はこれを行うのですか:

var myfunc = function() { /* code */ };

...

myfunc();

これの代わりに:

function myfunc() { /* code */ }

...

myfunc();

どちらか一方を使用する利点はありますか? 両方の例が異なる場所で使用されているのを見てきました。

4

3 に答える 3

4

私が知る限りの唯一の違いは、無名関数は自分自身を再帰的に呼び出すことができないが、名前付き関数はできるということです。これらの両方を組み合わせた 3 番目のタイプの構造があります。つまり、名前付きの関数式を持つことができます。

var myfunc = function myfunc() { /* code */ };
于 2012-08-03T00:46:27.307 に答える
3

関数が正常に宣言されている場合、識別子を再宣言しても関数名 (その識別子) は削除できません。識別子は、そのスコープが終了したときにのみ削除されます。

function myfunc() { /* code */ };

if (delete myfunc) { //will fail
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

myfunc = null;

if (delete myfunc) { //will still fail
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

var myfunc = null;

if (delete myfunc) { //will still fail
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

ただし、関数宣言が変数に割り当てられている場合、その識別子は削除できます。これは、グローバル関数を作成する必要があるが一時的にしか使用しない場合に特に便利です。これにより、不要になったときに削除したり、サードパーティのスクリプトとの識別子の衝突を回避したりできます。

var myfunc = function() { /* code */ };

if (delete myfunc) { //will succeed
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}

//or...
var myfunc = function myrealfunc() { /* code */ };

if (delete myfunc) { //will succeed
  alert('myfunc deleted');
} else {
  alert('can not delete myfunc');
}
于 2012-08-03T01:33:00.873 に答える
-2

いくつかの違いがありますが、ほとんどは実用的なものです。関数を「var」する場合、通常の想定は、ある種の「ローカル」スコープ関数です (ネストされた関数と考えてください)。を行うと function myFunction() {}、ほとんどの場合、関数はグローバル スコープであると見なされます (ただし、これを無名関数内にラップすることもできます)。

JavaScript の「クラス」の場合、ローカル スコープの関数を作成する場合は、「var」を使用して宣言する必要があります。

var myClass = function() {
 var test = function() {
  //This function has local scope
  }
};

上記のコメントに加えて、これは簡単な例です。

  var myVariable = resultFunction();


  function resultFunction() {
  return 1;
  }

上記のコードは機能します。ただし、次のことはできません

 var myVariable = resultFunction();


 var resultFunction = function() {
    return 1;
 };

しかし、あなたはすることができます

 var resultFunction = function() {
    return 1;
 };

 var myVariable = resultFunction();
于 2012-08-03T00:43:21.267 に答える