我知道使用eval完全没有推荐,我也读过这个链接。 Set Variable inside Eval (JavaScript)
但是,这就是我想要做的。假设我们在文本框中有一些代码。所以我必须获取该文本,然后找出该代码中的所有全局变量,函数和对象。 我的想法是将代码包装在命名空间中,对其进行评估,然后遍历命名空间的属性以获得结果。但是,即使eval成功运行,我也无法访问那里定义的变量。有没有更好的解决方案或其他方式来实现这一点。
http://jsfiddle.net/DbrEF/2/ - 这是小提琴。
“var code”实际上可以是任意代码。我知道这样做是不安全的,但我需要它用于不同的环境。 感谢
答案 0 :(得分:2)
2015年,creating a Function
object是您最好的选择,而非使用eval
:
(new Function('arg1','arg2',"return arg1+arg2")(3,4) // returns 7
答案 1 :(得分:0)
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;