2012-04-10 7 views
1

初心者の方の質問、たぶん些細なものでしょう。JavaScript変数の範囲(XUL関連)

<window 
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 

    <script type="application/javascript" src="chrome://.../main.js"/> 

    <button label="Click me!" oncommand="clickhandler()"/> 
</window> 

JavaScriptコード:

// main.js 

var test = "Peanut butter"; // a global variable 

function clickhandler() { 
    alert(test); 
} 

通訳だけで、メインウィンドウの開始タグを読んだ後、JavaScriptファイルを処理し、XULコードの残りの部分と進み、ここではXULのコードスニペットです。私の意見では、test変数は、インタープリタが処理を終了した瞬間に範囲外になるはずですmain.js。さらに、clickhandler()関数もスコープ外になっているはずです。つまり、ボタンをクリックしても何も起こりません。まあ、私はdocument.testdocument.clickhandler()と宣言しない限り、例えば、。しかし、簡単な実験で私は間違っていました。ボタンをクリックすると、関数と変数の両方が存在します。このように宣言された変数の実際の寿命はどのくらいですか?彼らはいつ破壊されますか?アプリケーションが終了するまで周囲にいるのですか?ベストプラクティスと参考文献は高く評価されています。

+1

いくつかの良い参考文献:http://stackoverflow.com/questions/39691/javascript-best-practices。機能の外側と「VAR」のないものは、「ウィンドウ」名前空間で定義されます(例えばwindow.test、window.clickhandler) – fenone

答えて

3

あなたはブロックスコープで慣れ親しんでいた言語のように動作することを期待しています。 Douglas Crockfordの著書「The Good Parts」を読んで、すべての仕組みがどのように機能するのかをより深く理解することをお勧めします。あなたが最初からこれをすべて学ぶなら、道のりをはるかに簡単にすることができます。

Javascriptは機能的にスコープされています。この例では、テストはfooのスコープ内にあります。この例では

var foo = function() { 
    var test = "Peanut Butter"; 
}; 

、あなたはそれがグローバルスコープの変数だとして機能テストを修正することができることがわかります。

グローバルスコープ変数を定義する3つの方法がありますが、そのすべてを避けることをお勧めします(不可能ではありません)。グローバル変数は必要ですが、軽減することができます。彼らの生涯は、JavaScriptがロードされている限りです。同じページによってロードされた異なる.jsファイルに複数のグローバル変数を定義すると、これらのグローバル変数は両方からアクセス可能になり、誤って別のファイルの変数を誤って上書きすることが非常に簡単になります。

1:実行したように、関数の外にvarステートメントを配置します。

2:プロパティとしてグローバルオブジェクトに追加します。

window.foo = value; 

3.宣言することなく変数を使用します。これは暗黙のグローバルです。本当にこれらについて注意してください。あなたが宣言した関数は実際には "clickhandler"と呼ばれる暗黙のグローバルなものです。

foo = value; 

一般的な慣行のグローバル変数の使用を最小限に抑えるためには、あなたが他のライブラリとの衝突を避けるために、あなたのグローバル変数の残りの部分を保持するために、アプリケーション固有のグローバル変数を定義するグローバル除害、として知られています。これは、オブジェクトリテラルを宣言し、グローバル変数を作成する第2の方法を使用して行います。ただし、グローバル変数が必要な場合にのみこれを使用し、可能な場合は機能範囲に固執しようとします。あなたはjavascriptのの世界にでより深く得るとき

var AWESOMENEWAPP = {}; 
AWESOMENEWAPP.test = "Peanut Butter"; 

、あなたは清潔で整理してコードを保つために閉鎖などのような便利なものについての学習を始めます。

ちょうどjavascriptのはあなたの典型的な古典語のように動作するように期待していないと、あなたはそれだけで異なる独自の権利で強力な言語、であることがわかります。

あなたの旅では、ツールJSLintを使用して、コードがコンパイルされていないため表示されない慣習とエラーをテストすることをお勧めします。ここ

+0

この徹底的な回答は、そんなにありがとうです! –

+0

_ "彼らの生涯はページが存在する限りです。" _ XUL appsのネイティブな外観は私をそんなに欺いて、彼らが本質的に「ページ」であることを忘れてしまった。これは、より多くのトップレベルのウィンドウがある場合、XPCOMオブジェクトを使用することとは別に、実際にグローバル変数(それらの間で共有される)を作成する方法がないことを意味しますか? –

+0

私はXULを実際に使ったことがないので、正直では分かりません...しかし、異なるウィンドウ間でデータを共有したい場合は、現在(IMO)それを行う最善の方法はウェブメッセージAPIです。他のウィンドウにメッセージを送信してデータを共有し、それがメッセージを受信する可能性があることを知っているハンドラと、それをどう処理するのかを指定します.. XULアプリケーションを使用せず、それで、あなたのために何が最善であろうと言うのは難しいです。 –

1

はい、グローバル関数と変数は、ユーザーがアプリケーションを終了するか、ブラウザを使用している場合はそのタブを閉じるまで存在します。そのため、グローバルスコープを可能な限り変数や関数で氾濫させないようにすることがベストプラクティスです。