5

を使用してグローバル変数を設定するコードevalが機能しません。割り当てがまったく呼び出されていないかのようですが、スクリプト エラーは発生しません。

<script type="text/javascript">

    $(function() {

        setTimeout(function() {
            eval('var x = 1;');
            alert(x);
        }, 0);
    });
</script>

<div onclick="alert(x);">Click to see 'x'</div>

ページが読み込まれると、アラートが期待どおりに表示されます。x = 1 であることを確認します。しかし、その後、div をクリックすると、x未定義の JavaScript エラーが発生します。evalこの変数を適切に追加するにはどうすればよいですか?

背景: 上記のコードは、AJAX 応答中に JavaScript コードを実行する必要がある、私が取り組んでいるプロジェクトからの最小限の再現例です。evalほとんどの場合、正常に動作しますが、これが問題を引き起こしています。

4

3 に答える 3

5

グローバルスコープwindow.eval()から実行するために使用できます。これにより、の変数としてeval()割り当てられます。これは、グローバル変数とは何か、に接続された変数です。varwindowwindow

...しかし、あなたは本当にすべきではありません。eval()理由でサンドボックス化されています。

それは、自分が何をしているのかを本当に理解し、を介して受け取っているすべてのものを信頼しない限りではありませんXMLHttpRequest。それはそれらの鶏/卵のものの1つです:それを実行するのに十分なコードを信頼するなら、それは最初にグローバル変数の前に付けるのに十分にプログラムされるべきwindow.です。したがって、を使用する必要はありませんwindow.eval()

さらに、より管理しやすいものを使用して非同期の頭痛を回避しようとしているのでない限りXMLHttpRequest(すべてが初めてです...)、実際にはスクリプトタグを作成し、そのソースを割り当てて、子として追加する必要があります。頭または体のタグ。スクリプトタグを動的に追加することは、特に大きなスクリプトの場合、XHRを使用するよりもさらに高速です。

于 2013-03-01T00:46:01.400 に答える
3

Eval はローカルで実行され、ローカル変数を設定しています。

グローバル変数を設定するには、var;を削除します。

<script type="text/javascript">

    $(function() {

        setTimeout(function() {
            eval('x = 1;');
            alert(x);
        }, 0);
    });
</script>
于 2012-08-28T21:32:34.063 に答える
2

グローバル変数を設定することはお勧めしませんが、どうしてもwindow必要な場合は、次のオブジェクトを使用してください。

window['x'] = 1;
于 2012-08-28T21:32:47.413 に答える