1

動的オブジェクトをクロージャーでラップし、後で、囲まれた変数を参照できるメンバーをオブジェクトに追加できるようにするにはどうすればよいでしょうか?

この例が示すようにtest.myFunct()、囲まれたexample変数を参照することはできません:

var example = "from global";
(function (global) {
    var example = "from closure";
    global.test = {};
}(this));

test.myFunct = fnction () { return example; };
test.myFunct(); // "from global"

そこで、問題を解決することを期待して加算関数を作成しようとしましたが、役に立ちませんでした:

var example = "from global";
(function (global) {
    var example = "from closure";
    global.test = {
        add: function (name, value) { global.mJSON[name] = value; }
    }
}(this));

test.add("myFunct", function () { return example; });
test.myFunct(); // "from global"

後で実行時に、囲まれたメンバーを参照できるメンバーをオブジェクトに動的に追加する方法はありますか?

必要な理由:

のjScriptエンジンにアクセスするためにmIRC のCOM 実装を使用しています。MSScriptControl.ScriptControlmIRC を使用する際の制限により、mIRC からのコマンド実行ごとに最大 4k バイトに制限されています。そのため、 、、またはメソッドを呼び出す前に、JS ファイルを ~3500 バイト以下のチャンクに分割する必要がありScriptControlます。AddCodeExecuteStatementEval

:

囲まれた変数/関数の値を返す静的な「ヘルパー」関数を使用する必要はありません。

4

1 に答える 1

1

後で実行時に、囲まれたメンバーを参照できるメンバーをオブジェクトに動的に追加する方法はありますか?

いいえ1、(javascript) クロージャーの定義と矛盾します。囲まれた変数の代わりにパブリック プロパティを使用するだけです。


1:evalクロージャー スコープで (文字列から) 新しい関数を作成し、それをメンバーとして配置するために使用できます。しかし、それは純粋な悪です。

var example = "from global";
(function (exports) {
    var example = "from closure";
    exports.addPrivileged = function(name, args, body) {
        body = arguments[arguments.length-1];
        args = Array.prototype.slice.call(arguments, 1, -1).join(", ");
        this[name] = eval("(function("+args+"){"+body+"})");
        name = args = body = null;
    };
}(test={}));

test.addPrivileged("myFunct", "return example");
console.log(test.myFunct()); // "from closure"
于 2014-08-31T17:25:47.200 に答える