“代码运行中的访问变量”;“评估”;在Javascript中

“代码运行中的访问变量”;“评估”;在Javascript中,javascript,Javascript,我知道不建议使用eval,我也读过这个链接 然而,这就是我想要做的。假设我们在文本框中有一些代码。所以我必须获取这些文本,然后找出代码中的所有全局变量、函数和对象。 我的想法是将代码包装在名称空间中,对其求值,然后遍历名称空间的属性以获得结果。但是,即使eval成功运行,我也无法访问其中定义的变量。是否有更好的解决方案或其他方法来实现这一点 -这是小提琴 “var代码”实际上可能是任意代码。我知道这样做不安全,但我需要一个不同的环境。 感谢您使用eval安全使用 因此,无论您有什么代码,都要将

我知道不建议使用eval,我也读过这个链接

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

-这是小提琴

“var代码”实际上可能是任意代码。我知道这样做不安全,但我需要一个不同的环境。 感谢您使用eval安全使用


因此,无论您有什么代码,都要将其包含在一个函数中,该函数将用作您的命名空间。然后将该函数作为变量存储到外部世界。显示了如何构造它,但是,它仅在代码采用对象文字表示法时才起作用

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
};​

您可能会更幸运地使用Javascript解析器,比如2015年JSHint/JSLint使用的解析器,这是您最好的选择,而不是使用
eval

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

可能不是OP想要的,但另一种选择是使用外部变量存储eval内部生成的值,如:

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

亲密选民-这怎么太本地化了?啊,这是我一直在努力避免的事情。这似乎确实有效。但是,如果代码类似于以下函数Dog(){this.greet=function(){return'Hello world';}this.dontgreet=function(){return'Hello world';}它将如何处理多行代码?我无法将您的示例与我上面粘贴的内容一起使用。有什么想法吗?不知怎的,这条评论搞砸了上面的代码格式,但它的多行更新了我的代码。这是概念的证明,但拥有任意代码真的很危险。任意代码是有风险的。然而,其目的是一种小型ide,我们可以在其中对对象进行内省。我知道您是如何实现这一点的,但如果我们以函数Dog()为例,则在运行eval时会出现以下错误-“missing:after property id”(这是我示例中的构造函数字符串)。
var value;
var code = 'var foo = 42';
code = code.replace('var foo', 'value');
eval(code);
value // returns 42;