2014-08-31 3 views
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's реализации COM для доступа к MSScriptControl.ScriptControl «s JScript двигателя. Из-за ограничений с использованием mIRC я ​​ограничен ~ 4k байтами для выполнения каждой команды из mIRC. Таким образом, мне нужно разорвать свой JS-файл на куски ~ 3500 байт или меньше, прежде чем вызывать методы AddCode, ExecuteStatement или Eval.

Примечание:

Я предпочел бы не использовать статическую «вспомогательную» функцию, которые возвращают значения переменных/функций, заключенных.

+1

Почему вы пытаетесь заключить их в закрытие вместо того, чтобы просто сделать их общедоступными, если хотите, чтобы они были доступны для произвольных функций? – Bergi

+0

Мой план был/должен иметь функцию обертки, которая переваривает аргументы, а затем возвращает динамический объект, зависящий от этих переваренных аргументов. – SReject

+0

Как бы вы это использовали? Где вам это нужно? – Bergi

ответ

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" 
+0

Пара примечаний: «экспорт» - это зарезервированное слово, вызывающее ошибки, которые нужно выбросить, и 'test.add (. ..) 'должен быть' test.addPrivileged (...) ' – SReject

+0

@SReject: Конечно. Я исправил это, когда попытался, но забыл скопировать его обратно в сообщение. – Bergi

Смежные вопросы