아래 시나리오에서 eval()이 선언 된 변수에 대한 참조를 어떻게 얻을 수 있습니까?JavaScript에서 eval() 중에 작성한 로컬 변수에 대한 참조 얻기
참고 사항 : 평가되는 JavaScript는 신뢰할 수있는 출처에서 나왔습니다.
아래 시나리오에서 eval()이 선언 된 변수에 대한 참조를 어떻게 얻을 수 있습니까?JavaScript에서 eval() 중에 작성한 로컬 변수에 대한 참조 얻기
참고 사항 : 평가되는 JavaScript는 신뢰할 수있는 출처에서 나왔습니다.
평가는() 호출자와 동일한 범위에서 실행되므로이 작동합니다 :
function test() {
eval("var myVariable = 5");
var locals = {};
locals.myVariable = myVariable; // TODO What should we do here?
alert(locals["myVariable"]); // returns myVariable
}
그러나 만약 당신이 원하는 경우 (평가 후면() 호출에 선언 된 어떤 변수를 확인할 수 없습니다)
function test() {
eval("var locals = {myVariable: 5};");
alert(locals["myVariable"]);
}
나를 위해 작동합니다. eval()
은 새 범위를 만들지 않습니다.
나는 그 변수들의 이름을 미리 모른다는 것을 지적했다. – dpq
로 간단한 :
eval("var myVariable = 5");
//no magic is needed
alert(myVariable); // returns myVariable
변수의 이름을 모르는 경우 어떻게해야합니까? 나는. 나는 그들의 이름을 먼저 알아야한다. – dpq
당신이 평가'에 전달하는 것을 그 코드에 영향을 줄 수있는 능력이 있는가()'처럼 보인다? 다른 말로하면이 코드를 변경하여이 작업을 수행 할 수 있습니까? 아니면 다른 소스에서 온 코드로 인해 변경 될 수 있습니까? – Pointy
코드를 변경할 수 있습니다. 너는 무엇을 제안 하는가? – dpq
코드를 * 명시 적으로 * 예측 가능한 이름을 가진 객체로 선언 한 다음 그 객체 내에 다른 (예측할 수없는) 속성을 넣으면 (@ tomalak의 대답 참조), 그 것을 사용할 수 있습니다. 그러나'eval()'은 새로운 스코프를 만들지 않으며, 내가 아는 한 당신이 객체처럼 취급 할 수있는 방식으로 로컬 "클로저"스코프에 대한 참조를 얻을 수있는 방법이 없습니다. – Pointy