9

私はeval関数を持っています。これはphpからjavascriptを実行する必要があります。しかし、要素を渡す必要があるので、ユーザーがクリックしたリンクにマウスオーバーのヒントを置くことができます。

var globalEval = function globalEval(src, element) {
        if (window.execScript) {
            window.execScript(src);
            return;
        }
        var fn = function(element) {
            window.eval.call(window,src);
        };
        fn(element);
    };

次の方法で$(this)要素を渡すim

globalEval(js_code, $(this));
// js_code is = alert(element);

未定義の要素のエラーが発生します。これは、これをglobalEval();修正するにはどうすればよいですか?

4

3 に答える 3

12

これは、グローバル eval が variable と同じスコープでコードを呼び出していないため、スコープの問題ですelementeval が悪evalであっても使用する必要がある場合は、必要な環境でコードを呼び出せるようにする必要があります。これを行う 1 つの方法は、選択した環境変数のパラメーターを指定する無名関数としてラップすることです。

例えば

window.eval.call(window,'(function (element) {'+src+'})')(element);

これは、匿名関数を返すため、src文字列が解析されますが、呼び出されないことを意味します。eval次に、データを渡して呼び出します。この場合はelement.

でテストするとvar element = document.body, src = 'console.log(element.tagName)';、ログが表示されます"BODY"。この方法でグローバル変数 (または関数) を設定する場合は、明示的にグローバルとして宣言する必要があることに注意してください ( window.foobar = ...)。そうしないと、無名関数の終了後に GCd されます。

于 2012-12-16T22:53:57.050 に答える
6

コードを評価するときに設定したいだけの場合は、次を試しください。this

// Code you want to evaluate
var code = 'return this.whatever'

// What you want "this" bound to:
var that = { whatever: 69 }

// Now do this:
var result = new Function(code).call(that)

Function コンストラクターを使用すると、期待どおりの結果が得られます。グローバル eval には多くの荷物が伴いますが、そのうちのいくつかは驚くかもしれません。不要なら避けたほうがいいです。

本当にそれを呼び出したい場合elementは、Function コンストラクターでもそれを行うことができます。

code = 'alert(element)'
var use_element = 69
result = new Function("element", code).call(this, use_element)
于 2012-12-16T23:07:46.310 に答える