所以,我想在A
点击按钮时运行这个脚本。脚本作为字符串存储在 Object 中。单击按钮 A 时,我使用 eval,例如:eval(Object[script])。这很好用,除非我在脚本中有函数,否则当我这样做时,它会中断,因为它们没有被定义。有没有办法解决这个问题?我尝试将函数定义放在 var 中并将其放在脚本的顶部。现在,如果我只是将脚本复制到控制台,它就会完美执行。有没有办法像在控制台中输入一样执行脚本?
仅供参考:这是对我的问题的简化,我意识到有更好的方法来做我在这里描述的事情。
所以,我想在A
点击按钮时运行这个脚本。脚本作为字符串存储在 Object 中。单击按钮 A 时,我使用 eval,例如:eval(Object[script])。这很好用,除非我在脚本中有函数,否则当我这样做时,它会中断,因为它们没有被定义。有没有办法解决这个问题?我尝试将函数定义放在 var 中并将其放在脚本的顶部。现在,如果我只是将脚本复制到控制台,它就会完美执行。有没有办法像在控制台中输入一样执行脚本?
仅供参考:这是对我的问题的简化,我意识到有更好的方法来做我在这里描述的事情。
最好的解决方法是停止将代码存储为字符串。 改用函数。
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
这有效:
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"]);
在您的代码alert(hi)
中应该是alert("hi")
obj = {
first: 'function test() { alert("hi") } test();'
}
eval(obj["first"]);