Как получить доступ к динамическим локальным переменным

#javascript #variables #dynamic #scope #local-variables

#javascript #переменные #динамический #область видимости #локальные переменные

Вопрос:

Как я могу ссылаться на динамическую локальную переменную? Это легко достигается с помощью глобальной переменной:

 myPet = "dog";  
console.log(window["myPet"]);
  

Как бы я сделал то же самое в локальной области?


В частности, что я пытаюсь сделать:

 myArray = [100,500,200,800];  
a = 1; // Array index (operand 1)  
b = 2; // Array index (operand 2)  
  

В зависимости от ситуации, я хочу оценить a<b или b<a

  • Для достижения этой цели я устанавливаю две переменные: compare1 и compare2
  • compare1 будет ссылаться либо на a, либо на b, а compare2 будет ссылаться на другой
  • Вычислить compare1 < compare2 или наоборот

Следующее отлично работает с глобальными переменными. Однако я хочу, чтобы a и b были локальными.

 compare1 = "b"; compare2 = "a";  
for(a=0; a<myArray.length; a  ){  
  b = a 1;  
  while(b>=0 amp;amp; myArray[window[compare1]] < myArray[[compare2]]){    
    /* Do something; */
    b--;  
  }
}  
  

Если в приведенном выше я установил compare1=a , то мне пришлось бы сбрасывать compare1 каждый раз, когда a изменялся. Вместо этого я хочу на самом деле [посмотреть / указать на] значение a.

Ответ №1:

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

 var animals = { dog: "Rover", cat: "Flopsy", goldfish: "Killer" };
var which = 'dog';
alert(animals[which]);
  

Комментарии:

1. Этот ответ выполняет именно то, что я пытаюсь сделать, спасибо. Однако, ради аргумента, возможно ли динамически ссылаться на локальные переменные? К чему они будут привязаны (как в глобальном привязаны к ‘window’)?

2. Локальные переменные добавляются к «объекту активации», который создается для каждой вводимой вами функции. Насколько мне известно, нет способа получить доступ к объекту активации для динамического доступа к его членам. — Дмитрий Сошников провел много исследований и хорошо написал о внутренних компонентах ECMAScript. Вот статья, которую он написал, в которой обсуждается, как работает AO. Прочтение этого должно привести вас к определению того, есть ли способ или нет: dmitrysoshnikov.com/ecmascript/chapter-2-variable-object /…

Ответ №2:

Вы можете выполнить это с помощью eval , однако использование eval крайне не рекомендуется. Если вы можете согласовать свои потребности с рекомендацией Дэвида Дорварда, я бы это сделал:

 var myPet = 'dog';
var dog = 'fido';

eval("alert("   myPet   ")");  // alerts "fido"
  

Комментарии:

1. Спасибо, Мэтт, eval — единственный способ, которым я мог это сделать, но я пытался избежать этого.

Ответ №3:

вы можете ссылаться на локальную переменную глобально, если она возвращается функцией.

 function dog(name) {

  var local = name;

  return local;

}

myPet = dog('spike');

alert(myPet);