2

関数定義を即時の匿名関数でラップする利点はありますか?

jsfeatライブラリの例を次に示します。

var get_channel = (function () {
    return function(type) {
        return (type & 0xFF);
    }
})();

それとも、次のことを行う方が良いですか?

var get_channel = function(type) {
    return (type & 0xFF);
};

この場合、最初のバージョンを支持する利点はないようです。

  1. 長くて読みにくいですが、
  2. クロージャーは外側のアクティベーション オブジェクトへの参照を保持するため、より多くのメモリを消費しますが、そこには有用なデータがありません。
  3. エンジンがより長いスコープチェーンを通過する必要がある場合、グローバル変数へのアクセスに時間がかかるため、(少なくとも理論的には) 遅くなることがあります。
4

1 に答える 1

2

いくつかの利点がありますが、提供した例には表示されません。できるというメリットがあります

  1. スコープ内でデータをキャプチャすることにより、よりクリーンな関数を作成し、関数のロジックがデータによって妨げられたり難読化されたりしないようにします。これは、データを構築する必要があるが、その後は毎回同じであることが予想される場合、またはグローバル名前空間で競合を引き起こさない複数の呼び出しでデータを共有したい場合に特に役立ちます。
  2. 環境または計算に応じて、返す関数を選択します。これにより、同じ計算を何度も実行する必要がなくなります。

たとえば、次のようなクロスブラウザーXHR 関数を作成できます。

var XHR = (function () {
        if (window.XMLHttpRequest)
            return function () {
                return new XMLHttpRequest();
            };
        else
            return function () {
                return new ActiveXObject("Microsoft.XMLHTTP");
            };
    }());

これで、今後の の呼び出しでロジックXHRを実行する必要がなくなりifます。ロジックは常に同じです。

于 2013-08-13T12:21:48.997 に答える