私のチームがDojo 1.8にアップグレードした後、私がプロジェクトで作業していたレガシー・スクリプトのいくつかがもう機能していないことに気付きました。具体的には、作成したグローバル変数はもう作成されていませんでした。Dojo 1.8 - 必要に応じてグローバル変数を作成
Dojo 1.8チームはグローバル変数に非常に反対していることがわかりました。だから彼らはそれが物理的に不可能、ユーザーが自分の最後に次のコードを使用して、必要なスクリプト内のグローバル変数を作成するために作ることを、実際には、反対が必要です:素晴らしいとすべてが、古いです
req.eval =
function(text, hint){
return eval_(text + "\r\n////@ sourceURL=" + hint);
};
var eval_ = new Function('return eval(arguments[0]);');
私が使用しているコードは変更できないため、これを回避してローカルコンテキストで評価を実行する方法を理解しようとしています。
幸いにも、dojo.eval
はまだDojoの古いバージョンからあります。それは私がしたいことです。だから、req.eval
にアクセスし、機能をreturn dojo.eval(...)
に変更するか、場合によってはeval(...)
に変更するだけで済みます。
問題は、私はreq
へのアクセスを取得する方法を見つけることができませんでした。
私のHTMLファイルの上部にあるスクリプトタグにdojo.js
が含まれています。独自のスクリプトファイルにロードされます。
は自分のファイルからアクセスできます。私はそれが重要なのかどうかわからない
'dojo/_base/loader':function(){
define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
:これは、スクリプトファイルにdefine
で定義されています。とにかく、dojo.require
の範囲内で、私はinjectModule
と呼ばれるものを見ることができますが、自分のファイルではできません。 injectModule
はローカル変数なので、this
と表示されません。
req.getText(url, legacyMode!=sync, xhrCallback);
req.eval
に行く:それはinjectModule
関数内すなわち
(function(){ ... injectModule = function(){} ... })();
、ファイルの先頭に匿名関数で定義され、次の行があります。従ってinjectModule
はreq
を見ることができます。
私は何をすべきか分かりません。私の悪いJavaScriptのトリックは、私がスコープのこの混乱を乗り切り始めるのを助けたことはありません。良いスタートはdojo.require
を呼び出す私の外側のスクリプトファイルからinjectModule
を見る方法を考え出すことです。私はバインドではできませんでしたが、これは無名関数で定義されたローカル変数です。これは可能になるだろうか?
ファイル1:
<script src="dojo.js"></script>
dojo.require(File 3);
console.log(globalVar);
ファイル2:
(function(){req.eval = unhelpful function})();
define(["require"], function(module){
dojo.require = function(x){req.eval(x)}
});
ファイル3:
globalVar = ...;
I
が物事を少し簡単にするために、ここにまとめますファイル1とファイル3は変更できますが、ファイル3は変更できます常にグローバル変数が必要です。私はファイル2を変更することはできません。ファイル2のreq.eval
をより良い機能に変更することです。
スコープの変更により、ファイル3はまだそれを見ることができないため、グローバル変数を先に宣言することはできません。
スコープが正しくなく、JSがサーバー側で縮小されているため、リフレクションと文字列の置換が機能しません。
ファイル1のメソッドを上書きすることは、スコープを見ることができないため機能しません。
JavaScript bind
機能を使用することも効果がありませんでした。
あなたはファイル3に 'window.globalVar = 42'を試みたことがありますか? – James
私はそうではなかったし、それは働いた、ありがとう。私は「n = 5」と「window.n = 5」がどのように違うかを実際に理解していません。 –