0

私は中規模の JavaScript API の 1 つを「多数のグローバル変数と関数」から、jQuery やその他のよく考えられた JavaScript ライブラリで使用される名前空間のカプセル化に似たものに変換しようとしています。これを実現するために、匿名関数を使用しています。

コードの一部を次に示します。

(function(window, undefined) {
    var MyLib = (function() {
        var AbortProgram = true;
        function DisplayAbortProgram() { alert('AbortProgram inside=' + AbortProgram); }
        return { AbortProgram: AbortProgram, DisplayAbortProgram: DisplayAbortProgram }
    } ())
    window.MyLib = MyLib;
})(window);

MyLib.AbortProgram = false;
alert('AbortProgram outside=' + MyLib.AbortProgram);
MyLib.DisplayAbortProgram();

実行すると、AbortProgram の外側の値は false ですが、内側の値は true のままです。この投稿は、これが起こっている理由を確認するためのものですか? その return ステートメントが DisplayAbortProgram の値を返し、それへの参照ではないためだと思います。根本的な理由は、JavaScript が参照ではなくプリミティブ型の値を返すことです。オブジェクトは参照によって渡されます。

私はこれを読んで、そのブール変数への参照を返す方法がないと信じているので、SetAbortProgram(value) という関数を実装する必要があります。

4

3 に答える 3

2

参照ではなく値渡しであることは正しいです。パラメータ オブジェクトを作成します。それは参照によって渡されます:

 var args = { AbortProgram: true };

の代わりargsに回りますAbortProgram。経由でブール値にアクセスできますargs.AbortProgram

于 2013-01-19T19:12:12.693 に答える
2

AbortProgramクロージャーによって隠されているため、変更できません。ほとんどの場合、これが使用するパターンの目標です。

あなたがすることMyLib.AbortProgram = false;は、既存の隠し変数を変更することではなく、新しいAbortProgram変数を追加することです。

変更可能にしたい場合はAbortProgram、コードを単純化して

var MyLib = {
        AbortProgram: true,
        DisplayAbortProgram: function DisplayAbortProgram() { alert('AbortProgram inside=' + this.AbortProgram); }
};

MyLib.AbortProgram = false;
MyLib.DisplayAbortProgram();

または、既存のコードにセッターを追加します。

(function(window, undefined) {
    var MyLib = (function() {
        var AbortProgram = true;
        function DisplayAbortProgram() { alert('AbortProgram inside=' + AbortProgram); }
        function setAbortProgram(v) {AbortProgram=v}
        return { AbortProgram: AbortProgram, DisplayAbortProgram: DisplayAbortProgram, setAbortProgram:setAbortProgram}
    } ())
    window.MyLib = MyLib;
})(window);

MyLib.setAbortProgram(false);
alert('AbortProgram outside=' + MyLib.AbortProgram);
MyLib.DisplayAbortProgram();
于 2013-01-19T19:13:42.207 に答える
1

根本的な理由は、JavaScript が一部のプリミティブ型の値を返し、参照ではないことです。

一部だけではありません。すべてのプリミティブ型は値として渡されます。オブジェクトのみがそのプロパティへの参照です。

私はこれを読んで、そのブール変数への参照を返す方法がないと信じているので、SetAbortProgram(value) という関数を実装する必要があります。

はい、変数を変更したい場合。それでも、オブジェクトのプロパティをどこでも使用できます。

于 2013-01-19T19:14:15.967 に答える