-1

私のプロジェクトには、この構造のjsファイルがほとんどありません。

(function (window, $) {
    var reload = function (force) { /* implementation here */ };
    //more variables are here, the same construction as above
})(this, $);

より多くのそのようなファイルがあります、ウェブサイトの各部分(ページ)のために、ページを管理するためにこの構造を持つ1つのjsがあります。サイト全体が単一のページであり、これらのjsファイルはコンテンツを非表示にしたり表示したり埋めたりすることでDOMノードを管理します。これにより、ユーザーは複数のページを表示してナビゲートしているように見えます。

  1. 上記の構造がどのようにロードされるかについて簡単に説明したいと思います-これらすべてのjsスクリプトをロードするhead.jsライブラリが表示されますが、どこにロードされ、どのようにアクセスするかがわかりません。

  2. 必要な特定のreload()に自分でアクセスする方法を知りたいです。私が言ったように、同じ構造(resources.js、users.js、reports.jsなど)を持つより多くのjsファイルがあります。たとえば、HTMLのボタンを押すとreports.js内のリロード機能にアクセスするにはどうすればよいですか?これらすべてのスクリプトをロードしますか?

4

3 に答える 3

1

これは自己呼び出し関数であり、変数識別子の再利用を回避し、サード パーティ コードを破壊するための優れた方法です。

もう 1 つのポイントは、自己呼び出し関数内で宣言された変数は、関数本体のスコープでもグローバル スコープでも使用できることです。スクリプト中に作成された「ガベージ」は、関数の終了時に収集できるため、これも便利です(OK、クロージャーで使用する場合は必ずしもそうではありません)。

また、関数スコープでそのような変数を宣言するため、独自の「自己呼び出し関数スコープ」で処理を行う他のライブラリは、変数と関数の識別子を使用しますが、両方が異なるスコープであるため問題ありません!

function (window, $)

上記の署名の場合、自己呼び出し関数には 2 つの入力パラメーターがあります。

  • windowは、JavaScript ブラウザーの Window オブジェクトを保持します。
  • $は、ショートカット オブジェクトまたは関数 (通常は jQuery) を保持します。

このような入力パラメーターを宣言すると、識別子を再利用して別のオブジェクトを格納できるため、多くの問題を回避できwindowますが、自己呼び出し関数のスコープ内では、別の参照であるためオブジェクトwindowが保持されます。Window

たとえば、html でボタンを押して、reports.js 内のリロード機能にアクセスするには、これらのスクリプトをすべてロードしますか?

関数全体を格納するローカル変数を宣言していreload()ます。任意のスコープでアクセスできるようにするには、グローバル スコープで宣言する必要があります。

var reload = null;

(function (window, $) {
    // Setting the variable living in the global scope!
    reload = function (force) { /* implementation here */ };

    //more variables are here, the same construction as above

})(this, $);
于 2013-02-26T15:03:45.017 に答える
1

コードのスニペットだけを考えると、#2 の答えは、外部からアクセスできないということですreload。これは、定義されるとすぐに呼び出される関数である「即時に呼び出される関数式」のローカル変数として宣言されます (これは #1 に答えると思います)。

通常、これはいくつかのメソッドとプロパティを公開するモジュールを作成するために使用されます。たとえば、コードが次の場合:

var obj = (function (window, $) {

    var reload = function (force) { /* implementation here */ };

    return {
        reload : reload
    };

})(this, $);

realod次に、次のように呼び出すことができます

obj.reload();
于 2013-02-26T15:00:34.573 に答える
1

これらの .js ファイルを変更しない限り、これらの変数にアクセスすることはできません。

(function (window, $) {

    var reload = function (force) { /* implementation here */ };

    //more variables are here, the same construction as above

    window.reload = reload;

})(this, $);

上記のコードreloadは、コードの外部から変数/メソッドを使用できるようにします。

于 2013-02-26T15:00:36.663 に答える