2

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

仅供参考:这是对我的问题的简化,我意识到有更好的方法来做我在这里描述的事情。

4

3 回答 3

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
于 2013-06-06T22:13:15.180 回答
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"]);
于 2013-06-06T22:02:48.457 回答
1

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

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

演示。

于 2013-06-06T22:15:08.633 回答