JavaScript에서 문자열을 변수 이름으로 변환


260

해결책을 찾았지만 그 해결책을 찾지 못했습니다.

라는 변수가 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;

5
이것을 위해 무엇을 사용하고 있습니까? 이 변수를 일반 로컬 변수로 설정해야하며 객체 (해시)가 작동하지 않습니까?
Dogbert

음 ... 나는 아직도 배열이있는 세상에서 왜 이것을하고 싶은지 잘 모르겠습니다. 어쨌든 일부 코드와 설명은 많은 도움이 될 것입니다.
케빈 차베스

나는 우리가 당신의 궁극적 인 목표가 무엇인지에 대해 더 자세한 정보가 필요하다고 생각합니다
mcgrailm

답변:


280

전역 변수 인 경우 window[variableName] 또는 귀하의 경우 window["onlyVideo"]트릭을 수행해야합니다.


35
심지어 글로벌하지 않을 경우, 당신은에 의해 그런 식으로 액세스 할 수 있습니다 scope[property]또는this[property]
요이치 Bednarski

7
@WojciechBednarski : 범위와 컨텍스트를 혼동하지 마십시오. this문맥, 그것이 가리키는 것은 함수가 어떻게 호출되는지에 달려 있습니다. JS에서, 시간의 50 % this입니다 window당신이 엄격 모드를 활성화하지 않으면 this됩니다 undefined및 오류가 발생합니다. 범위는 완전히 다른 것이며 객체가 아닙니다 ( window오브젝트에 의해 미러링되는 전역 범위 제외 )
slebetman

3
하지 작업을 수행합니다 WebWorkers(여기서 selfreffers 글로벌 스코프에, 그것이 동일한의 브라우저에서와 마찬가지로 window)과 Node.js를 여기서 global원하는 변수입니다. 또한 최신 기능은 기능 본문과 같은 로컬 범위에서 작동합니다.
Tomáš Zato-복원 모니카

어쨌든 const이 방법을 사용하여 정의 할 수 있습니까?
toing_toing

165

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 ()


3
그래, 나는이 대신 창을 사용하여 갈 것입니다 (몇 가지주의 사항이 있습니다)
ingo

12
eval()답변이 삭제로 내려진 이유는 무엇 입니까?
BoltClock

4
@goggin 인수를 정규식 테스트하여 유효한 이름인지 확인해야합니다. 먼저 확인하지 않고 논쟁을 피하는 것은 엄청나게 안전하지 않습니다.
Šime Vidas

16
이것은 질문에 대한 유일한 현실적인 답변입니다. 그것이 "eeeeevil"평가와 관련되었다고해서 덜 사실이되지는 않습니다. 자바 스크립트에는 변수 변수 (예 : PHP의 $$ varname)가 없으므로 이것이 유일한 해답입니다. 를 사용하면 window[varname]원하지 않는 전역 변수를 도입하는 부작용이 있습니다. @ Shaz 현대 JS 통역사들에게 충분한 신용을 줄 것이라고 생각하지 않습니다. 그것들은 매우 빠르며 간단한 1 라인 할당 작업을 파싱하고 실행한다고해서 1ms 타이머 나 타이트한 루프에서 수행되지 않는 한 다른 사람의 CPU 사용량이 급증하지는 않습니다.
MooGoo

2
@TheParamagneticCroissant 코드 관리에 열정을 가진 사람들. 시간과 돈만 소중히 여기는 사람들은 그렇지 않습니다.
Jimbo

41

평가 대 글로벌 변수 솔루션까지 ...

나는 각각에 장점이 있다고 생각하지만 이것은 실제로 잘못된 이분법입니다. 글로벌 네임 스페이스에 대한 편집증이라면 임시 네임 스페이스를 만들고 동일한 기술을 사용하십시오.

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

tempNamespace[myString] = 5;

그런 다음 저장 창을 사용하지 않고 tempNamespace.myVarProperty (현재 5)로 액세스 할 수 있는지 확인하십시오. (끈은 괄호에 직접 넣을 수도 있습니다)


동일한 인라인을 만들기 위해 코드를 약간 리팩터링합니다. var tempNamespace = {[ "myVarProperty"] : "Definitely only video"};
Tioma

1
이것은 매우 좋은 해결책입니다-절대적으로 필요한 경우가 아니면 eval ()을 피하는 것처럼 보입니다. 매우 우아한 해결 방법입니다.
skwidbreth 2012

document.body.getElementsByTagName ( '*') 컬렉션으로 시작하여 'id'속성이있는 모든 요소를 ​​쉽게 찾고 전역 개체 'id'에서 각 요소의 요소 개체 값에 대한 변수를 쉽게 만들 수 있습니다. 그런 다음 JavaScript에서 <div id = container>를 'id.container'로 참조 할 수 있습니다. 너무 쉽게!
David Spector

15
var myString = "echoHello";

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

echoHello();

받는 사람 아무 말도 악마의 평가. 예 : https://jsfiddle.net/Shaz/WmA8t/


3
로컬 범위 에서이 작업을 수행하고 downvote를 제거합니다.
Tomáš Zato-복원 모니카

@ TomášZatofunction aScope() { this[myString] = function() { alert("Hello!"); };};
rrw

@richmondwang this은 로컬 범위가 아니라 호출 중에 함수가 바인딩되는 객체를 나타냅니다.
Tomáš Zato-복원 모니카

8

창 객체를 연관 배열로 액세스하여 그렇게 설정할 수 있습니다

window["onlyVideo"] = "TEST";
document.write(onlyVideo);

8

window [ 'variableName'] 메소드는 변수가 전역 범위에 정의 된 경우에만 작동합니다. 정답은 "리 팩터"입니다. "객체"컨텍스트를 제공 할 수있는 경우 가능한 일반적인 솔루션이 존재하지만 변수의 범위를 기반으로 전역 함수가 해결할 수없는 일부 변수가 있습니다.

(function(){
    var findMe = 'no way';
})();

6

객체의 속성에 액세스하려는 경우 객체의 범위로 시작하여 원하는 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]];

깊이에 관계없이 모든 객체의 속성을 얻는 데 효과적입니다.


당신의 예는 멋지다. name변수 이름으로 사용 하면 예제가 실패하지만 다른 변수 이름과 작동합니다. name변수가 이미있는 Window 개체와 관련이있을 수 있습니다 . 또한 .value방법을 포함하여 오류가 발생했습니다. 깊이 중첩 된 객체 변수를 해석하는 기능은 내가 찾고있는 것이며 귀하의 방법은 좋은 방향을 나타냅니다. 감사.
Theo

문제 없어요. 답은 (대부분의 답변은 내가 생각에 여기에) 대답을 붙여 / 개념을 보여 아닌 사본으로 더

1
SO 응답은 수정하는 대신 개선하는 데 시간을 할애 할 때 더 좋습니다. ;-)
Theo

작동하지 않습니다 :Uncaught TypeError: Cannot read property 'split' of undefined
Roberto14


0

이렇게 할 수 있습니다

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


0

다음 코드를 사용하면 JavaScript에서 각 DIV 및 기타 HTML 요소를 쉽게 참조 할 수 있습니다. 이 코드는 모든 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";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.