Преобразовать строку в имя переменной в JavaScript - PullRequest
227 голосов
/ 10 апреля 2011

Я искал решения, но не смог найти ничего подходящего.

У меня есть переменная с именем onlyVideo.

"onlyVideo" строка передается в функцию. Я хочу установить переменную onlyVideo внутри функции как-то. Как я могу это сделать?

(Существует ряд переменных, которые могут быть вызваны в функцию, поэтому мне нужно, чтобы она работала динамически, а не жестко if утверждениями.)

Редактировать: Вероятно, есть лучший способ сделать то, что вы пытаетесь сделать. Я спросил это в начале моего приключения JavaScript. Посмотрите, как работают объекты JavaScript.

Простое вступление:

// create JavaScript object
var obj = { "key1": 1 };

// assign - set "key2" to 2
obj.key2 = 2;

// read values
obj.key1 === 1;
obj.key2 === 2;

// read values with a string, same result as above
// but works with special characters and spaces
// and of course variables
obj["key1"] === 1;
obj["key2"] === 2;

// read with a variable
var key1Str = "key1";
obj[key1Str] === 1;

Ответы [ 10 ]

253 голосов
/ 10 апреля 2011

Если это глобальная переменная, то window[variableName] или в вашем случае window["onlyVideo"] должен сделать свое дело.

152 голосов
/ 10 апреля 2011

Javascript имеет функцию eval() для таких случаев:

function (varString) {
  var myVar = eval(varString);
  // .....
}

Редактировать: Извините, я думаю, что снял вопрос слишком быстро. Вы получите только переменную, для ее установки вам нужно

function SetTo5(varString) {
  var newValue = 5;
  eval(varString + " = " + newValue);
}

или если используется строка:

function SetToString(varString) {
  var newValue = "string";
  eval(varString + " = " + "'" + newValue + "'");
}

Но я думаю, что есть более подходящий способ достичь того, что вы ищете? Я не думаю, что eval () - это то, что вы действительно хотите использовать, если нет веских причин для этого Eval ()

39 голосов
/ 14 июня 2013

Насколько eval против глобальных переменных решений ...

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

var tempNamespace = {};
var myString = "myVarProperty";

tempNamespace[myString] = 5;

Уверен, что вы можете получить доступ к файлу tempNamespace.myVarProperty (теперь 5), избегая использования окна для хранения. (Строка также может быть вставлена ​​непосредственно в скобки)

15 голосов
/ 10 апреля 2011
var myString = "echoHello";

window[myString] = function() {
    alert("Hello!");
}

echoHello();

Скажи нет злу Эвал. Пример здесь: https://jsfiddle.net/Shaz/WmA8t/

8 голосов
/ 10 апреля 2011

Вы можете получить доступ к объекту окна в виде ассоциативного массива и установить его таким образом

window["onlyVideo"] = "TEST";
document.write(onlyVideo);
7 голосов
/ 29 марта 2014

Метод окна ['variableName'] работает ТОЛЬКО, если переменная определена в глобальной области видимости. Правильный ответ - «Рефакторинг». Если вы можете предоставить контекст «Объект», то возможно общее решение, но есть некоторые переменные, которые ни одна глобальная функция не может разрешить в зависимости от области действия переменной.

(function(){
    var findMe = 'no way';
})();
4 голосов
/ 07 июня 2015

Если вы пытаетесь получить доступ к свойству объекта, вы должны начать с области действия window и пройти через каждое свойство объекта, пока не доберетесь до того, которое вам нужно.Предполагая, что a.b.c было определено где-то еще в сценарии, вы можете использовать следующее:

var values = window;
var str = 'a.b.c'.values.split('.');

for(var i=0; i < str.length; i++)
    values = values[str[i]];

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

2 голосов
/ 25 августа 2018

Вы можете сделать это

var name = "foo";
var value = "Hello foos";
eval("var "+name+" = '"+value+"';");
alert(foo);
0 голосов
/ 24 ноября 2018

Следующий код позволяет легко ссылаться на каждый из ваших DIV и других элементов HTML в JavaScript. Этот код должен быть включен непосредственно перед тегом, чтобы все элементы HTML были видны. За ним должен следовать ваш код JavaScript.

// For each element with an id (example: 'MyDIV') in the body, create a variable
// for easy reference. An example is below.
var D=document;
var id={}; // All ID elements
var els=document.body.getElementsByTagName('*');
for (var i = 0; i < els.length; i++)
    {
    thisid = els[i].id;
    if (!thisid)
        continue;
    val=D.getElementById(thisid);
    id[thisid]=val;
    }

// Usage:
id.MyDIV.innerHTML="hello";
0 голосов
/ 19 июля 2017

Это можно сделать вот так

(function(X, Y) {
  
  // X is the local name of the 'class'
  // Doo is default value if param X is empty
  var X = (typeof X == 'string') ? X: 'Doo';
  var Y = (typeof Y == 'string') ? Y: 'doo';
  
  // this refers to the local X defined above
  this[X] = function(doo) {
    // object variable
    this.doo = doo || 'doo it';
  }
  // prototypal inheritance for methods
  // defined by another
  this[X].prototype[Y] = function() {
    return this.doo || 'doo';
  };
  
  // make X global
  window[X] = this[X];
}('Dooa', 'dooa')); // give the names here

// test
doo = new Dooa('abc');
doo2 = new Dooa('def');
console.log(doo.dooa());
console.log(doo2.dooa());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...