Как создать динамические члены объекта, которые могут ссылаться на вложенные переменные / функции?
Как бы я мог создать динамический объект таким образом, чтобы он был обернут в замыкание, а затем мог бы добавить к объекту членов, которые могут ссылаться на вложенные переменные?
Как показывает этот пример, 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 mIRC для доступа MSScriptControl.ScriptControl
движок jScript Из-за ограничения использования mIRC, я ограничен ~4k байтами на выполнение команды из mIRC. Поэтому мне нужно разбить мой файл JS на куски размером ~3500 байт или меньше перед вызовом ScriptControl
"s AddCode
, ExecuteStatement
, или же Eval
методы.
Примечания:
Я бы предпочел не использовать статические "вспомогательные" функции, которые возвращают значения переменных / функций в приложении.
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"