4

すぐに呼び出される匿名の関数式からオブジェクトを返す場合、それはどこに行きますか?たとえば、このコードのfooはどこにありますか。

(function(){ 
    var foo;
    return foo;
})();

これには便利なアプリケーションがありますか?

4

4 に答える 4

9

結果変数にその戻り値を割り当てずに自己実行関数から値を返すことは、どこにも行かない単なる戻り値であり、したがって、関数内のデータへの新しい参照を作成しません。したがって、関数が戻るとすぐに、returnステートメントがない場合と同じように、データがガベージコレクションされます。したがって、この:

(function(){ 
    var foo;
    return foo;
})();

関数から値を返し、戻り値を何にも割り当てないのと同じです。

これを実行して、戻り値を取得します。

var result = (function(){ 
    var foo = "hello";
    return foo;
})();

作業デモ: http: //jsfiddle.net/jfriend00/t9wJL/


値を返すことの有用性について。戻り値を変数に割り当てたり、他の関数への入力として使用したりすると便利ですが、そうでない場合は何も実行されません。

于 2012-08-19T00:55:18.630 に答える
2

便利なアプリケーションは機能テストです。たとえば、一部のブラウザはtextContentプロパティをサポートし、一部はinnerTextをサポートし、一部は両方をサポートします。サポートをテストし、適切なプロパティを使用する関数を作成できます。

function getText(el) {

  if (typeof el.textContent == 'string') {
    return el.textContent;

  } else if (typeof el.innerText == 'string') {
    return el.innerText;
  }
}

毎回同じテストを実行するのは非効率的であると感じるかもしれません(それほどではない)ので、サポートを検出し、テストを1回だけ実行し、その後適切なプロパティを使用する関数を作成することをお勧めします。

var getText = (function() {
  var el = document.createElement('div');

  if (typeof el.textContent == 'string') {
    el = null;
    return function (el) { return el.textContent;};

  } else if (typeof el.innerText == 'string') {
    el = null;
    return function (el) { return el.innerText;};
  }
}());

上記の関数は少し欠陥があり、単なる例です。

開き括弧と閉じ括弧は省略できますが、コードを読み取るときに役立ちます。これは、中間または最後のどこかではなく、最初の行から即時呼び出し関数式(IIFE)であることがわかります。

主な利点は、不要なグローバル参照を作成せずにコードを実行し、それらをクリーンアップする必要がないことです。上記の例ではel、返された関数とIIFEの間にクロージャ(to)を作成するため、コンパイラがクロージャが使用されていないことを十分に理解していない限り、ページをアンロードするまでガベージコレクションされない可能性があります。

クロージャは、このようにIIFEを使用した結果ですが、IFFEが巨大であり、クロージャが無駄である場合を除いて、重要ではありません(多くの場合、それらは有用です)。

于 2012-08-19T00:33:03.757 に答える
1

自己実行関数の目的が新しいスコープを作成することである場合、何かを返すことは意味がありません。関数が変数に割り当てられている場合、戻り値が変数に割り当てられます。

var foo = (function(){ return 'foo' }()); // this makes sense
于 2012-08-19T00:06:30.450 に答える
0

関数が実行された結果、fooが返されます。変数に割り当てられているか、別の関数に渡された場合にのみ「存在」します。

var x = (function(){ 
    var foo;
    return foo;
})();
console.log(x)

それは役に立ちますか?

于 2018-03-06T09:07:09.617 に答える