从String执行JavaScript

时间:2013-06-06 21:56:22

标签: javascript jquery

因此,我想在单击按钮A时运行此脚本。脚本作为字符串存储在Object中。单击按钮A时,我使用eval,如:eval(Object [script])。这工作正常,除非我在脚本中有函数,当我这样做时,它会因为没有定义而中断。有办法解决这个问题吗?我尝试将函数定义放在var中,并将其放在脚本的顶部。现在,如果我只是将我的脚本复制到控制台,它就会完美地执行。有没有办法执行脚本,就像它被输入控制台一样?

仅供参考:这是我的问题的简化,我意识到有更好的方法可以做我在这里描述的内容。

3 个答案:

答案 0 :(得分:2)

最好的解决方法是停止将代码存储为字符串。改为使用函数。

buttonA.script = function() {
    do whatever you were doing in your eval
};

// then, instead of `eval(buttonA['script'])`, say...
buttonA.script();

// or, if the name is in a variable...
var foo = 'script'; // for example
buttonA[foo]();

关于唯一有意义的时间eval是有代码的,其本质上必须动态生成或解释。对于绝大多数情况,情况并非如此。事实上,我只能想到这样的情况:评论中提到的textarea脚本测试事项。

对于其他所有情况......

obj = {
    first: function() {
        function test() { alert('hi'); }
        test();
    }
};

obj['first']();
// or simply
obj.first();

// and what's more...`test` doesn't escape and trample on stuff.
try { test(); }
catch (ex) { alert("" + ex); }  says `test` is not defined

答案 1 :(得分:1)

这有效:

var oFunc = function (value) {
                    alert(value)
            }

var obj = { code: "oFunc('hello')" }

eval(obj["code"]);

或者我错过了什么?

更新

这也有效

var obj = { code: "var oFunc = function (value) {alert(value)}; oFunc('hello')" }
eval(obj["code"]);

答案 2 :(得分:1)

在您的代码中alert(hi)应为alert("hi")

obj = {
    first: 'function test() { alert("hi") } test();'
}
eval(obj["first"]);

DEMO.