Локальная переменная JavaScript объявляет

На первый взгляд: грузовое культовое приложение идиом кода.

, Как только я более внимательно рассмотрел: очевидные ошибки и неправильные представления программистом.

8
задан Paweł Witkowski Photography 13 July 2009 в 13:14
поделиться

8 ответов

Хорошо, я нашел связанный вопрос, который говорит о том, что мне нужно ...

Как я могу получить доступ к локальной области динамически в javascript?

Я просто помню, что в ECMA 262 есть только один из способов добавить динамически локальные переменные в область видимости с помощью оператора with (и, конечно, eval), вот решение:

var x=function(obj)
{

    with(obj) 
    {
       alert(someObj);
    }
 }
 alert(typeof someObj);


 x ( {someObj:"yea"}) ;

 alert(typeof someObj);
1
ответ дан 5 December 2019 в 17:39
поделиться

То, что вы ищете, называется объектом вызова . Но согласно это , вы не можете получить к нему доступ напрямую, поэтому вам не повезло.

6
ответ дан 5 December 2019 в 17:39
поделиться

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

function x(arg)
{
    var localSpace = {};
    localSpace[arg.name] = arg.value;
}
1
ответ дан 5 December 2019 в 17:39
поделиться

Должно быть, я что-то упускаю. Чем то, что вы хотите, отличается от простого выполнения:

 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 или делать что-то странное.

1
ответ дан 5 December 2019 в 17:39
поделиться

Вы можете попробовать трюк с именованными аргументами
РЕДАКТИРОВАТЬ: Это не кроссбраузер

function x( {sex:sex, height:height} ) {
    alert( sex );
    alert( height );
}

x( { sex: 'male', height: 'short' } );
x( { height: 'medium', sex: 'female' } );

// male
// short
// female
// medium
1
ответ дан 5 December 2019 в 17:39
поделиться

Интересный вопрос, никогда не думал о чем-то подобном. Но каков вариант использования?

Причина, по которой вы захотите сделать что-то подобное, заключается в том, что вы не знаете имя переменной. Но в этом случае единственный способ снова получить доступ к переменной - это использовать тот же объект ссылки. Т.е. вы можете просто использовать любой старый объект для хранения данных.

Чтение из такого ссылочного объекта было бы интересно для целей отладки, но я не понимаю, почему вы хотите писать в него.

Изменить:

Приведенный вами пример не убеждает меня в необходимости доступа к локальной области видимости, поскольку в предупреждении все еще жестко задано имя пол . Это может быть реализовано как:

function x(arg)
{
  container = {};
  container[arg.name] = arg.value;
  alert(container.sex);
}

Не могли бы вы подробнее рассказать о примере?

0
ответ дан 5 December 2019 в 17:39
поделиться

Я не совсем уверен, что понимаю ваш вопрос. При создании класса x я обычно делаю следующее:

function x(args) {
  var _self = this;

  _self.PriviledgedMethod(a) {
      // some code
  }

  function privateMethod(a) {
      // some code
  }
}

var newObject = new x(args);

Вы можете продолжить доступ к _self и args, поскольку он закрыт содержащимися функциями.

-1
ответ дан 5 December 2019 в 17:39
поделиться

Не уверен, что именно вам нужно, но вот мои 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";

Надеюсь, это поможет

.
1
ответ дан 5 December 2019 в 17:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: