4

次の内容の「test.js」ファイルがあるとします。

var test = 'something';

次に、テスト変数を取得するために test.js をロードする必要があるプライマリ スクリプトがあります。

明らかにこれは機能します:

$.ajax({dataType: "script", cache: true, url: 'test.js'});

問題は、変数testがグローバル スコープに存在することです。それをオブジェクトに追加してグローバルスコープから除外する方法があるかどうか興味があります。

何かのようなもの:

function scriptloader() {
    this.grabscript = function() {
        return $.ajax({dataType: "script", cache: true, url: 'test.js'});
    }
}

var myloader = new scriptloader();

myloader.grabscript();

理想的には、 myloader にはロードされた変数が含まれますtest。ただし、console.log(test) を実行しても「何か」が表示されます。

ロードされたスクリプトをスコープにロックする方法はありますか、それとも夢ですか?

4

4 に答える 4

3

あなたはこのようなことを試すことができます:

function scriptloader() {
  this.grabscript = function() {
    var loader = this;
    $.ajax('test.js', {
      complete: function(response) {
        var js = '(function() {' + response.responseText + ' loader.test = test; })();'
        eval(js);
      },
      dataType: 'text'
    });
  }
}

次に、scriptloaderインスタンスは。というプロパティを取得しますtest

于 2013-01-10T00:04:30.957 に答える
1

test.jsを制御できず、テストがグローバル変数として宣言されていることを受け入れる必要がある場合、回避策は、ページ内のiframeにtest.jsをロードすることです。この方法では、テストはグローバル変数になりますが、iframeウィンドウのスコープ内でのみ行われます。メインページから、としてアクセスできるようになりますifr.contentWindow.test

于 2013-01-10T00:20:22.487 に答える
1

evalその目的のために使用して、ローカルスコープで予想される名前の変数を作成できます。

(function(jsString) {
    var test;
    eval(jsString);
    console.log(test); // 'something'
})("var test = 'something';");
console.log(test); // Exception: undefined variable

次に、スクリプトの ajax で$.globalEval使用される(コード)の代わりに、そのカスタム関数を使用する必要があります。

もちろん、これはすべてのグローバル変数を網羅するメソッドではありません。そのような場合、別のグローバル オブジェクトを作成して (たとえば を使用して<iframe>)、そこでスクリプトを評価する必要があります。

ただし、変数を使用するよりも、JSONP を使用する方がよい場合があります。

于 2013-01-09T23:54:43.163 に答える