2012-03-23 6 views
2

evalの使用は推奨されておらず、このリンクも読んでいます。 Set Variable inside Eval (JavaScript)Javascriptの "eval"で実行されるコードからの変数へのアクセス

しかし、これは私がしたいことです。テキストボックスにコードがいくつかあるとします。だから私はそのテキストを取り、そのコード内のすべてのグローバル変数、関数、オブジェクトを調べなければなりません。 私の考えは、コードをネームスペースにラップし、それを評価してから、ネームスペースのプロパティを反復して結果を得ることでした。しかし、evalが正常に実行されても、そこに定義されている変数にはアクセスできません。これを実現するには、より優れたソリューションや他の方法がありますか?

http://jsfiddle.net/DbrEF/2/ - これはここのフィドルです。

"var code"は実際には任意のコードである可能性があります。私はそれをするのは安全ではないと知っていますが、私は別の状況のた​​めにそれが必要です。 おかげで無事に


"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 
}​; 
使用はevalを使用して上の

+0

close voter - どのようにローカライズされていますか? –

答えて

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(){ 返す 'hello world'; } }また、マルチラインコードをどのように扱うのでしょうか?私はあなたの上に貼り付けたものを使用することができません。何か案は ?どういうわけか、このコメントは、上記のコードの書式設定を邪魔しましたが、その複数行は不自然でした。 – ssarangi

+0

は自分のコードを更新しました。それは概念の証明ですが、任意のコードを持つことは本当に危険です。 – Joseph

+0

私は同意します。任意のコードは危険です。しかし、その目的は、オブジェクトに対するイントロスペクションを行うことができる、小さなIDEのようなものです。私はあなたがこれを実装している方法を見ていますが、私たちが関数Dog()を使った場合、あなたの例ではなく、evalを実行するときに 'missing:after property id'というエラーが発生します。 - http://pastebin.com/s6r5wjdc(これは私の例のconstructorStringです)。 http://jsfiddle.net/DbrEF/7/ – ssarangi

0

あなたはcreating a Function objectではなくevalを使用するよりも、ここにあなたの最善の策である、JSHint/JSLint

によって2015年に
+0

これは私がこれを避けようとしていたものです。 – ssarangi

2

を使用したものと同様に、Javascriptのパーサーを使用して、より良い運を持っているかもしれません。

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

関連する問題