来自Javascript中“eval”中运行的代码的访问变量

时间:2012-03-23 02:48:03

标签: javascript

我知道使用eval完全没有推荐,我也读过这个链接。 Set Variable inside Eval (JavaScript)

但是,这就是我想要做的。假设我们在文本框中有一些代码。所以我必须获取该文本,然后找出该代码中的所有全局变量,函数和对象。 我的想法是将代码包装在命名空间中,对其进行评估,然后遍历命名空间的属性以获得结果。但是,即使eval成功运行,我也无法访问那里定义的变量。有没有更好的解决方案或其他方式来实现这一点。

http://jsfiddle.net/DbrEF/2/ - 这是小提琴。

“var code”实际上可以是任意代码。我知道这样做是不安全的,但我需要它用于不同的环境。 感谢

4 个答案:

答案 0 :(得分:2)

2015年,creating a Function object是您最好的选择,而非使用eval

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

答案 1 :(得分:0)

here's a demo使用"use strict"

安全地使用eval
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
}​;

所以无论你有什么代码,都要将它包含在一个函数中,作为你的命名空间。然后将该函数返回到存储为变量的外部世界。 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
};​

答案 2 :(得分:0)

使用Javascript解析器可能会更好,比如JSHint / JSLint使用的解析器

答案 3 :(得分:0)

可能不是OP到底在寻找什么,而是另一种选择是使用外部变量存储在eval内部生成的值,如:

var value;
var code = 'var foo = 42';
code = code.replace('var foo', 'value');
eval(code);
value // returns 42;