2012-03-23 2 views
2

eval을 사용하는 것이 좋습니다는 아니며이 링크도 읽었습니다. Set Variable inside Eval (JavaScript)자바에서 "eval"로 실행되는 코드에서 변수에 액세스

그러나 이것은 내가하고 싶은 일입니다. 텍스트 상자에 코드가 있다고 가정 해 보겠습니다. 그래서 그 텍스트를 가져 와서 그 코드의 모든 전역 변수, 함수 및 객체를 찾아야합니다. 내 생각은 네임 스페이스에 코드를 래핑하고 평가 한 다음 네임 스페이스의 속성을 반복하여 결과를 얻는 것이 었습니다. 그러나 eval이 성공적으로 실행 되더라도 거기에 정의 된 변수에 액세스 할 수 없습니다. 더 나은 솔루션이나 다른 방법으로이 작업을 수행 할 수 있습니까?

http://jsfiddle.net/DbrEF/2/ - 여기가 피들입니다.

"var 코드"는 실제로 임의 코드 일 수 있습니다. 나는 그 일을하는 것이 안전하지 못하다는 것을 알고 있지만, 나는 다른 상황에서 그것을 필요로한다. 덕분에 안전하게


"use strict"

window.onload = function(){ 
    'use strict'; 
    //use strict forces to run code in "strict mode" 
    //use strict prevents eval from 
    //contaminating the immediate scope 

    //let's test with "foo" 
    var foo = 'lol'; 

    //now code has "foo" but using "use strict" 
    //makes code in eval stay in eval 
    //note that at the last of the code, foo is "returned" 
    var code = 'var foo = {name: "Spock",greeting: function() {return "Hello " + foo.name;}}; foo'; 

    //store eval'ed code in evalO 
    var evalstore = eval(code); 

    console.log(evalstore); //code in eval stays in here, which is "inner foo" 
    console.log(foo);  //"outer foo" is unharmed and daisy fresh 
}​; 
사용하여 평가를 사용하는 방법에 대한

+0

닫기 투표자 - 어떻게 이것이 너무 현지화 되었습니까? –

답변

0

here's a demo 그래서 당신이 어떤 코드 네임 스페이스 역할을하는 함수에 포함되어 있습니다. 그 함수를 변수로 저장된 외부 세계로 돌려 보내야합니다. this demo은 코드 작성 방법을 보여 주지만 코드가 객체 리터럴 표기법 인 경우에만 작동합니다.

window.onload = function() { 
    'use strict'; 

    var ns = 'lol'; 

    //code must be an object literal 
    var code = '{name: "Spock",greeting: function(){return "Hello " + foo.name;}}'; 

    //store in a constructor to be returned 
    var constructorString = 'var ns = function(){return ' + code + '}; ns'; 

    var evalNs = eval(constructorString);  //type function/constructor 
    var evalObj = new evalNs()    //object instance 

    console.log(evalNs); //constructor 
    console.log(evalObj); //the namespaced object 
    console.log(ns);  //outer "ns" preserved 
};​ 

+0

그게 효과가있는 것 같습니다. 그러나 코드가이 함수와 같은 경우 어떻게됩니까? Dog() { this.greet = function() { return 'Hello world'; } this.dontgreet = function() { return 'hello world'; } } 또한 다중 코드를 어떻게 처리합니까? 내가 위에 붙여 넣은 것에 예제를 사용할 수 없습니다. 어떤 아이디어? 어쨌든이 주석은 위의 코드 형식을 망쳤지만 여러 줄을 망쳤습니다. – ssarangi

+0

내 코드가 업데이트되었습니다. 그것은 개념의 증거이지만, 임의의 코드를 갖는 것은 실제로 위험합니다. – Joseph

+0

동의합니다. 임의의 코드는 위험합니다. 그러나 목적은 우리가 사물에 대한 내성을 수행 할 수있는 작은 종류의 일종입니다. 나는 당신이 이것을 구현하는 방법을 본다. 대신에 Dog() 함수를 사용하면 예제 대신 다음과 같은 오류가 발생한다. - 'missing : after property id'. eval을 실행할 때. - http://pastebin.com/s6r5wjdc (이 예제는 constructorString입니다). http://jsfiddle.net/DbrEF/7/ – ssarangi

0

당신은 더 나은 운이 아니라 eval를 사용하는 것보다, JSHint/JSLint에서 사용하는 것과 같은

+0

아, 그게 내가 피하려고했던 것입니다. – ssarangi

2

2015 년, creating a Function object가 가장 좋은 건 여기, 자바 스크립트 파서를 사용하여가있을 수 있습니다 :

(new Function('arg1','arg2',"return arg1+arg2")(3,4) // returns 7