2012-10-30 28 views
5

私のチームが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(){} ... })(); 

、ファイルの先頭に匿名関数で定義され、次の行があります。従ってinjectModulereqを見ることができます。

私は何をすべきか分かりません。私の悪い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機能を使用することも効果がありませんでした。

+0

あなたはファイル3に 'window.globalVar = 42'を試みたことがありますか? – James

+0

私はそうではなかったし、それは働いた、ありがとう。私は「n = 5」と「window.n = 5」がどのように違うかを実際に理解していません。 –

答えて

2

グローバルスコープはグローバルwindowオブジェクトからアクセスできるため、window.foo = 'bar'はグローバル変数fooを作成するのと同じです。これに関する詳細はこちらhttps://stackoverflow.com/a/4862268/168382

+1

これはうまくいかなかったが、これはうまくいった。私は「n = 5」と「window.n = 5」が同じことをしたと思っていましたが、それを行う道場の方法は、2つ目はまだ動作する別のものにすると思います。 –

+0

Dojo自身の 'global'エイリアスに関するもう1つの答えは、Node.jsのようなコンテキストで動作するため、より正確です。 docs here:http://dojotoolkit.org/reference-guide/1.8/dojo/_base/kernel.html#dojo-base-kernel-global – slikts

3

このため、dojoはdojo.globalを作成しました。 dojoがロードされたwindowを指します(フレームレイアウトの場合)。

だから、そのようなあなたのグローバル変数を宣言します

require([ "dojo/_base/kernel", ... ] , function(kernel) { 
    kernel.global.globalVariable = 1; 
    console.log('set') 
}) 

dojo.addOnLoad(function() {console.log('get', globalVariable);}); 
+2

Dojo 1.8で 'global'は' dojo/_base/kernel'にあります。 'dojo.global'ではなく' kernel.global'です。 – slikts

関連する問題