わかりました。これは4年後の2017年ですが、jQueryチームがこの問題に対処するのに苦労したことはないようです。私は同じ問題を抱えていましたが、これが解決策であり、ローカルコンテキストでgetScriptを使用する実際の意図された方法だと思います。私が気付いたのは、コードがローカルコンテキストでコードに対して簡単に評価される方法がないことでした。これは、jQueryがどのように進行しているかを認識していません。深く掘り下げていませんが、jQueryソースを見ると、スクリプトがドキュメントにどのように挿入されているか、それは天才であり、評価を完全に回避しています。したがって、スクリプトは、scriptタグを介してインポートされたファイルであるかのように実行されました。難しい話は抜きにして...
私は状況の逆を行うことにしました、それは何が起こっているのかをよりよく説明します。次に、問題の例に戻すことができます。
getScriptが実際に一意のIDをクエリ文字列でサーバーに送信していることに気付いた場合。彼らがドキュメントでこれについて言及しなかった理由はわかりません。これを使用して、返されたスクリプトを識別します。しかし、バックエンドで何かをしなければなりません...
let imports;
$.getScript("scripts.php?file=abc.js", (data, textStatus, jqXHR) => {
window[jqXHR.getResponseHeader('X-scriptID')](imports);
alert (imports.name);
});
abc.js:
imports.name = 'fred';
バックエンドは、scripts.phpを取得しているスクリプトをラップします。
// code that gets the file from file system into var $output
$output = file_get_contents($_REQUEST['file']);
// generate a unique script function name, sort of a namespace
$scriptID = "__script" . $_REQUEST['_'];
// wrap the script in a function a pass the imports variable
// (remember it was defined in js before this request) we will attach
// things we want to become local on to this object in script file
$output = "window.".$scriptID."=function(imports) { ".$output." };";
// set the script id so we can find this script in js
header ("X-scriptID: " . $scriptID);
// return the output
echo $output;
jsはgetScriptを介してスクリプトを要求しますが、ファイルに直接要求するのではなく、phpスクリプトを使用してファイルの内容をフェッチします。これは、返されたデータを変更し、返されたスクリプトを識別するために使用されるヘッダーを添付できるようにするためです(これは、この方法で多くのスクリプトが要求される大きなアプリです)。
getScriptが通常どおりブラウザで返されたスクリプトを実行すると、スクリプトの実際のコンテンツは実行されず、一意の名前__script1237863498などのラッパー関数の宣言のみが実行されます(番号は、以前にそのスクリプトを要求したときにgetScriptによって指定されました) )、グローバルウィンドウオブジェクトにアタッチされます。次に、jsはその応答を使用してラッパー関数を実行し、インポートオブジェクトにプロパティを挿入します...これは、要求しているスコープに対してローカルになります。