2

そこで、ボタンがクリックされたときにこのスクリプトを実行したいと思いAます。スクリプトはオブジェクトに文字列として格納されます。ボタン A がクリックされると、eval(Object[script]) のように eval を使用します。スクリプト内に関数がない限り、これは正常に機能しますが、関数が定義されていないため機能しません。これを回避する方法はありますか?関数定義を 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意味があるのは、その性質上、動的に生成または解釈する必要があるコードがある場合だけです。ほとんどの場合、それは正しくありません。実際には、コメントで言及されているテキストエリアスクリプトのテストというケースしか考えられません。

他のすべての場合...

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

あなたのコードalert(hi)にはalert("hi")

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

デモ。

于 2013-06-06T22:15:08.633 に答える