因此,我想在单击按钮A
时运行此脚本。脚本作为字符串存储在Object中。单击按钮A时,我使用eval,如:eval(Object [script])。这工作正常,除非我在脚本中有函数,当我这样做时,它会因为没有定义而中断。有办法解决这个问题吗?我尝试将函数定义放在var中,并将其放在脚本的顶部。现在,如果我只是将我的脚本复制到控制台,它就会完美地执行。有没有办法执行脚本,就像它被输入控制台一样?
仅供参考:这是我的问题的简化,我意识到有更好的方法可以做我在这里描述的内容。
答案 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"]);