2012-03-27 2 views
0

업데이트 함수/클래스의 코드는 문자열로 저장되므로 직접 호출 할 수 없습니다. 이 아이디어는 객체에 대한 내성 검사를 수행하고 함수 일 때 작동하지만 아래에있는 것과 같은 변수가 eval되었을 때 작동하지 않는 데이터 멤버를 열거하는 것입니다.eval은 undefined 대신 변수 이름을 반환합니다. (javascript)

자바 스크립트에서 개체를 평가하려고합니다. 이 같은.

var myObj { 
    greet: "Greeting", 

    myPrint: function() { 
     alert("hello"); 
    } 
}; 

아이디어는 평가에서 이것을 실행할 수와 변수 이름 어떻게 든 (myObj로) 또는 생성 된 객체를 얻는 것입니다. 나는 eval을 사용하는 다양한 방법으로 실험했지만 이것을 이해할 수는 없다. 이런 식으로 할 때 작동합니다.

function myObj() { 
    this.greet = "Greeting"; 

    this.myPrint = function() { 
     alert("hello"); 
    } 
}; 

eval ("("+ code + ")"); 여기서 code는 위의 함수를 포함하는 문자열로 myObj()를 반환합니다.

업데이트 2 그래서 기본적으로 나는 이와 같은 것을 평가하려고합니다. eval ("var x = 5"); x를 얻으려고합니다. 문자열이 평가되기 때문에 창 네임 스페이스에 추가 되더라도 문자열을 파싱하는 것만 빼면 해독 할 방법이 없습니다. 이제 이것은 간단한 예제 일뿐입니다.하지만 말했듯이, 첫 번째 코드에서는 약간 어렵습니다. 내가 말한대로 ... eval ("function test() {return 'hello';}"); return test()는 "var x = 5"문에서 기대하는 것과 비슷합니다.

누락 된 첫 번째 사례에 대해 이와 유사하게 수행 할 수있는 방법이 있습니까? 감사합니다.

+4

뭘하고 싶은지 잘 모르겠지만 좀 더 긴급한 질문은 * 왜 * 이걸하고 싶니? 무엇을 해결하려고합니까? –

+0

기본적으로 클래스/함수의 모든 데이터 멤버를 조사하고 싶습니다. 그러나 코드는 실제로 임의적이며 인트로 스펙 션 (indrospect)해야하는 텍스트 상자에 붙여 넣어집니다. (모든 데이터 멤버를 표시 할 수있는 IDE의 일종의 기능이라고 생각하면됩니다.) 임의 코드 실행은 eval에서 위험하다는 것을 알고 있지만 이것은 완전히 다른 목적을위한 것입니다. – ssarangi

+1

'myObj' 코드가 유효한 자바 스크립트가 아닙니다. 오타라고 가정하는 것이 안전할까요, 아니면 어떻게 든 평가할 필요가있는 실제 콘텐츠입니까? –

답변

0

myPrint 함수를 실행하지 않고 개체를 평가합니다.

당신은 경고를 던져 얻으려면

myObj.myPrint() 

같은 것을 할 필요가있다.

[편집] 즉시 myPrint 기능이 귀하의 코드를 변경 실행하려면 :

var myObj = { 
    greet: "Greeting", 

    myPrint: (function() { 
     alert("hello"); 
    })(); 
    }; 
+0

내가 언급 한 것을 잊어 버렸지 만 클래스/함수의 코드는 실제로 문자열에 저장됩니다. 이것이 내가 eval을 사용하고자하는 이유입니다. – ssarangi

+0

함수를 실행할 코드가 업데이트되었습니다. –

0

가 동적으로 콜백을 호출하려고합니까? 내 가정에서 올바른 생각하면 당신은 문자열을 전달한다면

var myObj = { // fixed this line of code as it was missing the = 
    greet: "Greeting", // replaced ; with , 

    myPrint: function() { 
     alert("hello"); 
    } 
}; 
console.log(eval(myObj)); // returns obj as expected. 

그것과 같을 것이다 당신은 대괄호 표기법을 사용해야합니다 및 EVAL 그래서

을 필요하지 않습니다 :

var str = 'myPrint'; 

var strTwo = 'greet' 

myObj[str](); // to execute the function 

myObj[strTwo]; // now contains "Greeting" 

어떤 그 함수를 실행할 것이다.

희망 하시겠습니까?

편집 :

http://jsfiddle.net/XtyHh/

+0

감사합니다 Tim, 그러나 문제는 "var myObj = {...}"에 대한 전체 코드가 문자열에 있다는 것입니다. 그것이 내가 직면하고있는 문제입니다. – ssarangi

+0

'myObj [str];'아무것도 실행하지 않습니다. 'myObj [str]();'것입니다. – jbabey

+0

ssarangi 업데이트를 참조하십시오 ... –

0

코드 :

var myObj = 'var myObj = { greet: "Greeting", myPrint: function() { alert("hello"); } }' 

console.log(eval(myObj)); 
myObj.myPrint(); 

그런 다음이이 당신이 제대로 문자열을 이스케이프하지 않는 것을 의미 작동하지 않는 경우에 당신이 원하는 것입니다 :

var sCode = '{ great: "Greating", myPrint: function() { alert("hello!"); } }', 
    oObj = eval("(" + sCode + ")"); 

oObj.myPrint(); // alert "hello" 
console.log(oObj.great); // prints "Greating" 
+0

여기에 sCode가 문자열 바깥에 정의되어 있습니다. 내가 기대하는 것은 var code = "var x = {greet : 'greeting'};" 그러나 eval ("+"code "+") ")를 사용하면이 작업을 수행하지 못합니다. – ssarangi

+0

'var x"를'eval()'과 함께 사용할 수 없습니다. –

관련 문제