5

私はJavascriptにやや慣れていないので、この1つの項目にこだわっています。javascript変数を、それが置かれている.jsファイルでのみ使用できるようにする方法を教えてください。

例:

PG1 と PG2 の 2 つの .js ファイルがあるとします。PG1 には var channel = Channel01 が含まれます。

PG2 には、同じ名前の変数が含まれていますが、入力された変数 (等号の後の部分) が異なります (var channel = Channel02)

PG1 の function1 で PG2 の変数を使用したり、PG2 の function2 で PG1 の変数を使用したりしたくありません。

また、別の HTML ページからこれらの関数を呼び出しています。

問題: すべての関数が、どのページにあるかに関係なく、1 つの変数のみを使用してしまいます。(例: function1 と function2 は両方とも var channel = channel01 を使用)

質問: page1 の関数を制限して、その .js ページの変数のみを使用するにはどうすればよいですか?

ありがとう!

4

4 に答える 4

9

すべてを即時呼び出し関数式でラップすると、ファイルに独自のスコープが効果的に与えられます。

(function() {
   // Your file's contents live here.
})();
于 2012-05-17T23:36:45.147 に答える
8

モジュールパターン:

var myModule = (function(exports){

    var x = "foo";

    exports.myFunction = function(){
        alert(x);
    };

})(typeof exports!="undefined" && exports instanceof Object ? exports : window );

myFunctionwindowブラウザのスコープで使用できるようになります。

編集

私は著者の言葉を引用します:「私はまた、これらの関数を別の HTML ページから呼び出しています。」

そのため、作成者は自分が定義した関数へのグローバル アクセスが必要です。

var myModule は必要ありませんが、エクスポートも必要ありません。AMD との互換性のためだけです。

(function(exports){

    var x = "foo";

    exports.myFunction = function(){
        alert(x);
    };

})(window);

現在、myFunction の x はクロージャにのみ存在しますが、myFunction は引き続きグローバル スコープで x にアクセスできます。グローバル スコープ内の任意の x 定義または影響を受けない任意のスコープx = "foo"

于 2012-05-17T23:38:08.870 に答える
4

実際に変数をグローバル スコープに公開する必要がない場合は、JavaScript コード全体を即時呼び出し関数式または IIFE でラップできます。ここでは、無名関数式を定義し、すぐに呼び出します。その結果、変数でグローバル スコープを汚染する代わりに、その関数のローカル スコープで適切に整頓することができます。

(function() {
    var channel = Channel01;

    // Put the rest of your PG1 code here, for example:

    function init() {
        channel.open();
    }

    init();
})();

次に、同様の方法で PG2 コードを IIFE にラップできます。Channel01その結果、2 つのスクリプトは、やなど、既に定義されているグローバル変数以外の変数を共有しませんChannel02

于 2012-05-17T23:46:45.600 に答える
1

あなたの質問に対する直接的な回答ではありませんが、これを見逃すと他のモジュールが汚染される可能性があるため、これは関連しており重要です。var キーワードを使用しない場合、変数はグローバル スコープにあります。

(function () {
   x = 'foo'; //x is on the global scope and can be seen everywhere
})()

(function () {
   var y = 'bar'; //y is local to this function
})()

誰かが上で言ったことを重複していないことを願っていますが、それが言及されているのを見ることができませんでした

于 2014-01-07T16:47:27.043 に答える