Как я могу получить доступ к локальной области динамически в javascript?
Если вы хотите динамически использовать глобальные функции и переменную, вы можете использовать:
window[functionName](window[varName]);
Можно ли сделать то же самое для переменных в локальной области?
Этот код работает правильно, но в настоящее время использует eval, и я пытаюсь думать о том, как это сделать.
var test = function(){
//this = window
var a, b, c; //private variables
var prop = function(name, def){
//this = window
eval(name+ ' = ' + (def.toSource() || undefined) + ';');
return function(value){
//this = test object
if ( !value) {
return eval('(' + name + ')');
}
eval(name + ' = value;')
return this;
};
};
return {
a:prop('a', 1),
b:prop('b', 2),
c:prop('c', 3),
d:function(){
//to show that they are accessible via to methods
return [a,b,c];
}
};
}();
>>>test
Object
>>>test.prop
undefined
>>>test.a
function()
>>>test.a()
1 //returns the default
>>>test.a(123)
Object //returns the object
>>>test.a()
123 //returns the changed private variable
>>>test.d()
[123,2,3]
Ответы
Ответ 1
Нет, например crescentfresh. Ниже вы найдете пример реализации без eval, но с внутренним частным объектом.
var test = function () {
var prv={ };
function prop(name, def) {
prv[name] = def;
return function(value) {
// if (!value) is true for 'undefined', 'null', '0', NaN, '' (empty string) and false.
// I assume you wanted undefined. If you also want null add: || value===null
// Another way is to check arguments.length to get how many parameters was
// given to this function when it was called.
if (typeof value === "undefined"){
//check if hasOwnProperty so you don't unexpected results from
//the objects prototype.
return Object.prototype.hasOwnProperty.call(prv,name) ? prv[name] : undefined;
}
prv[name]=value;
return this;
}
};
return pub = {
a:prop('a', 1),
b:prop('b', 2),
c:prop('c', 3),
d:function(){
//to show that they are accessible via two methods
//This is a case where 'with' could be used since it only reads from the object.
return [prv.a,prv.b,prv.c];
}
};
}();
Ответ 2
Чтобы ответить на ваш вопрос, нет, нет возможности выполнять динамический поиск переменных в локальной области без использования eval()
.
Лучшая альтернатива заключается в том, чтобы сделать ваш "объем" только обычным объектом [буквальный] (т.е. "{}"
) и вставить ваши данные там.
Ответ 3
Надеюсь, я не слишком упрощаю, но как насчет чего-то такого же простого, как использование объекта?
var test = {
getValue : function(localName){
return this[localName];
},
setValue : function(localName, value){
return this[localName] = value;
}
};
>>> test.a = 123
>>> test.getValue('a')
123
>>> test.a
123
>>> test.setValue('b', 999)
999
>>> test.b
999