0

js クラスの作成中に、window、document、Math、undefinedがクラスの最初と最後に引数として渡されることがわかりました。それらは役に立ちますか? また、その意味は何ですか?

var MyClass = (function (window, document, Math, undefined) {

  function MyClass (opts) {
    this.init(opts);
  }

  MyClass.prototype = {

    init: function (opts) {

    }

  return MyClass;
})(window, document, Math, undefined);
4

2 に答える 2

1

右中括弧がありません。

var MyClass = (function (window, document, Math, undefined) {

    function MyClass (opts) {
        this.init(opts);
    };

    MyClass.prototype = {

        init: function (opts) {

        }
    }; /* <-- closing brace here */

    return MyClass;

})(window, document, Math);

MyClass 関数/クラスの依存関係であるグローバルは、外部スクリプトが意図した動作を変更する可能性を軽減するために、匿名ラッピング関数によって作成されたメソッド クロージャーに渡されます。これは、API の設計者が信頼性を高めるために採用した手法です。MyClass 関数が定義された後/前に誰かが次のスクリプトを実行した場合、MyClass 関数のインスタンスが破損することを想像できます。

Math = undefined /* or some other value */;

したがって、意図したとおりになることに依存するコードは、Math突然壊れます。

家まで運転する


前述の理由とは別に、ローカル変数は縮小化できます。したがって、最終的にネットワーク経由で送信されるスクリプトのサイズが縮小されます。

于 2013-10-18T01:32:23.160 に答える
0

の用法:

var MyClass = (function (window, document, Math, undefined) {
 ...
})(window, document, Math, undefined);

見当違いです。ネイティブ メソッドへの「安全な」アクセスを取得することが意図されている場合、コードの実行前にこれらの識別子に新しい値が既に割り当てられていると失敗します。

あなたができる最善のことは次のとおりです。

var myClass = function(global) {

  // In here you can be certain that global references the global (window) object
  var window = global; 

  // and that the value of undefined will be undefined
  var undefined;

  // But you are still uncertain of
  var document = window.document;
  var Math = window.Math;

  ...

// guaranteed access to the global object
}(this));

thisの値は、どのコンテキストでも上書きできません (ただし、呼び出しまたはバインドを使用して関数に入るときに設定できます)。そのため、グローバル実行コンテキストでは、元のグローバル オブジェクトを参照する必要があります。ただし、Mathおよびウィンドウプロパティが再割り当てされている可能性があり、それを止めることはできません (ただし、ECMAScript の将来のバージョンでは、特定の状況でそれが不可能になる可能性があります)。

そのため、関心のあるプロパティが再割り当てされる前に IIFE を実行する必要がある場合、エイリアスを作成しても何の価値もありません。他の人が言ったように、それはミニフィケーションに役立つかもしれません。

ホスト オブジェクトとメソッドのエイリアスの作成には問題があることに注意してください。

var getEl = document.getElementById;
var el = getEl('foo');

getElementById関数がドキュメントのメソッドとして呼び出されることを想定している可能性があるため、エラーがスローされる可能性があり、したがってthisが正しく設定されていない可能性があります。

于 2013-10-18T09:50:18.893 に答える