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"

有没有办法在运行时后期动态地将成员添加到可以引用封闭成员的对象?

为什么需要它

我正在使用mIRC 的COM 实现来访问MSScriptControl.ScriptControljScript 引擎。由于使用 mIRC 的限制,我被限制为从 mIRC 执行的每个命令约 4k 字节。因此,在调用ScriptControl's AddCodeExecuteStatementEval方法之前,我需要将我的 JS 文件分解为大约 3500 字节或更小的块。

备注

我宁愿不必使用返回包含的变量/函数的值的静态“助手”函数。

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 回答