5

と呼ばれる次のスクリプトがあるとしinclude_strict.jsます。それが実行された後、私はwindow.global1定義する必要があります:

"use strict";

var globalVar = {};
alert(typeof window.globalVar);

しかし、JavaScriptのブロックからそれを含めると

$.getScript("include_strict.js");

アラートにはundefined。なんで?ここで何が起こっているのですか?

参考までに、スクリプトタグを使用してファイルを含めると、それは起こりません。

<script type="text/javascript" src="include_strict.js"></script>

ここに、予想されるアラートが表示されobjectます。そして、を削除すると"use strict";、両方が表示され、同じ効果があります。jQuery.getScript()<script>;object

これを示す例(https://docs.google.com/file/d/0B-XXu97sL1Ckb0x0OHptTmVMY00/edit)を作成しました。

4

3 に答える 3

11

これは、厳密モードでグローバル スコープを変更できないスクリプトを実行するために、$.getScript()which uses を使用します。eval

第二にeval、厳密モードのコードは、周囲のスコープに新しい変数を導入しません。通常のコードeval("var x;")では、変数 x を周囲の関数またはグローバル スコープに導入します。これは、一般に、eval への呼び出しを含む関数では、引数またはローカル変数を参照していないすべての名前を実行時に特定の定義にマップする必要があることを意味します (eval が外部変数を隠す新しい変数を導入した可能性があるため) )。厳密モードでは、 eval は評価されるコードの変数のみを作成するため、 eval は、名前が外部変数を参照するかローカル変数を参照するかに影響を与えることはできません。

ソース: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode

解決策は、jQuery を使用してスクリプトをロードするのではなく、script要素を DOM に追加することです。jQuery を使用して要素を追加することさえできないことに注意してください。自動的に使用$.getScript()されます。

于 2012-10-08T06:43:42.117 に答える
2

jQueryevalはスクリプトを使用します。「厳格を使用してください。」内部evalはコードのセマンティクスを変更します。そのため、strict モードは危険な場合があります。それをサポートしていないブラウザでは、コードは別のことをするからです。

第 2 に、strict モード コードの eval は、周囲のスコープに新しい変数を導入しません。通常のコードでは、 eval("var x;") は変数 x を周囲の関数またはグローバル スコープに導入します。これは、一般に、eval への呼び出しを含む関数では、引数またはローカル変数を参照していないすべての名前を実行時に特定の定義にマップする必要があることを意味します (eval が外部変数を隠す新しい変数を導入した可能性があるため) )。厳密モードでは、eval は評価されるコードに対してのみ変数を作成するため、eval は、名前が外部変数を参照するかローカル変数を参照するかに影響を与えることはできません。

https://developer.mozilla.org/en/JavaScript/Strict_mode

window.foo = "bar;"解決策は、の代わりに使用することですvar foo = "bar";。また、IIFE 内にコードを配置して、"use strict;" にする必要があります。より予測可能です。

(function(window) {
    "use strict";

    window.globalVar = {};
    alert(typeof window.globalVar);
}(window));
于 2012-10-08T06:43:45.093 に答える
0

実行前に厳密モードを削除して応答を処理します。

 $.ajax({
    url: scriptUrl,
    dataType: "script",
    dataFilter: function (data, type) {
        return data.replace("\'use strict\';", "");
    }
});
于 2016-11-02T09:01:32.737 に答える