我如何以一种包装在闭包中的方式创建动态对象,然后,能够在对象中添加能够引用所包含变量的成员?
如此示例所示,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's COM实现来访问MSScriptControl.ScriptControl
的jScript引擎。由于使用mIRC的限制,我从mIRC的每个命令执行限制为~4k字节。因此,在调用ScriptControl
的{{1}},AddCode
或ExecuteStatement
方法之前,我需要将我的JS文件分解为~3500字节或更小的块。< / p>
备注:
我宁愿不必使用静态“helper”函数来返回所包含的变量/函数的值。
答案 0 :(得分: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"