На первый взгляд: грузовое культовое приложение идиом кода.
, Как только я более внимательно рассмотрел: очевидные ошибки и неправильные представления программистом.
Хорошо, я нашел связанный вопрос, который говорит о том, что мне нужно ...
Как я могу получить доступ к локальной области динамически в javascript?
Я просто помню, что в ECMA 262 есть только один из способов добавить динамически локальные переменные в область видимости с помощью оператора with (и, конечно, eval), вот решение:
var x=function(obj)
{
with(obj)
{
alert(someObj);
}
}
alert(typeof someObj);
x ( {someObj:"yea"}) ;
alert(typeof someObj);
То, что вы ищете, называется объектом вызова . Но согласно это , вы не можете получить к нему доступ напрямую, поэтому вам не повезло.
Почему бы не создать объект в локальной области, а затем использовать его в качестве контейнера для любых переменных, которые вы хотите создавать динамически?
function x(arg)
{
var localSpace = {};
localSpace[arg.name] = arg.value;
}
Должно быть, я что-то упускаю. Чем то, что вы хотите, отличается от простого выполнения:
var newObject = 'some string';
? (OP уточнил вопрос)
Я не думаю, что есть способ сделать то, о чем вы просите. Используйте члены локального объекта, например
function doSomething(name, value)
{
var X = {};
X[name] = value;
if (X.foo == 26)
alert("you apparently just called doSomething('foo',26)");
}
. Если вы выбираете односимвольную переменную, такую как $ или X, она «стоит» вам 2 символа (имя переменной плюс точка) и позволяет избежать попытки использовать eval или делать что-то странное.
Вы можете попробовать трюк с именованными аргументами
РЕДАКТИРОВАТЬ: Это не кроссбраузер
function x( {sex:sex, height:height} ) {
alert( sex );
alert( height );
}
x( { sex: 'male', height: 'short' } );
x( { height: 'medium', sex: 'female' } );
// male
// short
// female
// medium
Интересный вопрос, никогда не думал о чем-то подобном. Но каков вариант использования?
Причина, по которой вы захотите сделать что-то подобное, заключается в том, что вы не знаете имя переменной. Но в этом случае единственный способ снова получить доступ к переменной - это использовать тот же объект ссылки. Т.е. вы можете просто использовать любой старый объект для хранения данных.
Чтение из такого ссылочного объекта было бы интересно для целей отладки, но я не понимаю, почему вы хотите писать в него.
Изменить:
Приведенный вами пример не убеждает меня в необходимости доступа к локальной области видимости, поскольку в предупреждении все еще жестко задано имя пол
. Это может быть реализовано как:
function x(arg)
{
container = {};
container[arg.name] = arg.value;
alert(container.sex);
}
Не могли бы вы подробнее рассказать о примере?
Я не совсем уверен, что понимаю ваш вопрос. При создании класса x я обычно делаю следующее:
function x(args) {
var _self = this;
_self.PriviledgedMethod(a) {
// some code
}
function privateMethod(a) {
// some code
}
}
var newObject = new x(args);
Вы можете продолжить доступ к _self и args, поскольку он закрыт содержащимися функциями.
Не уверен, что именно вам нужно, но вот мои 2 цента.
Единственный способ динамически создать vars в существующей функции - это метод eval, который вы уже упоминали.
Другой вариант (упомянутый другими) заключается в том, что ваша функция принимает контекстную карту, а шаблон обращается к ней с помощью точечной нотации (context.var1)
Мое последнее предложение - конструктор Function. Но у меня есть ощущение, что это может быть то, что вы ищете. (Обратите внимание, что конструктор функций страдает от тех же проблем, что и вызов eval)
var arg1 = "first";
var arg2 = "last";
// This is the body of the function that you want to execute with first
// and last as local variables. It would come from your template
var functionBody = "alert(first + ' ' + last)";
var myCustomFun = new Function(arg1, arg2, functionBody);
myCustomFun("Mark", "Brown"); // brings up and alert saying "Mark Brown";
Надеюсь, это поможет
.