#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);