Javascript 如何创建能够引用封闭变量/函数的动态对象成员?

Javascript 如何创建能够引用封闭变量/函数的动态对象成员?,javascript,com,closures,msscriptcontrol,Javascript,Com,Closures,Msscriptcontrol,我将如何创建一个动态对象,使其包装在一个闭包中,然后在以后能够向对象添加能够引用封闭变量的成员 如本例所示,test.myFunct()无法引用随附的example变量: var example = "from global"; (function (global) { var example = "from closure"; global.test = {}; }(this)); test.myFunct = fnction () { return example; };

我将如何创建一个动态对象,使其包装在一个闭包中,然后在以后能够向对象添加能够引用封闭变量的成员

如本例所示,
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"
是否有一种方法可以在稍后的运行时将成员动态添加到可以引用封闭成员的对象中

为什么需要它

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

注释

我不想使用返回所包含的变量/函数值的静态“helper”函数

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

这与(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"

当您想让任意函数访问它们时,为什么要尝试将它们封装在闭包中,而不是简单地将它们设置为公共属性?我的计划是使用一个包装函数,该函数对参数进行摘要处理,然后返回一个依赖于这些摘要参数的动态对象。您将如何使用它?您在哪里需要它?我正在使用COM实现来访问MSScriptControl.ScriptControl的jscript引擎。由于使用mIRC的限制,我将从mIRC执行的每个命令限制为~4k字节。因此,在调用ScriptControl的AddCode、ExecuteStatement或Eval methods.Omg之前,我需要将js文件分解为约3500字节或更小的块。那么你对黑魔法没问题吗?请注意:'export'是一个导致抛出错误的保留字,
test.add(…)
应该是
test.addPrivileged(…)
@srject:当然。我在试用的时候把它们修好了,但是忘了把它复制回帖子里。