1

初心者の質問、おそらく些細な質問。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コードを処理します。私の意見ではtest、インタプリタが処理を終了した瞬間に変数はスコープ外になるはずmain.jsです。さらに、clickhandler()関数もスコープ外になっているはずです。つまり、ボタンがクリックされても何も起こらないはずです。document.testええと、例えば、私がそれらをととして宣言しない限りdocument.clickhandler()。しかし、簡単な実験で私は間違っていることがわかりました。ボタンがクリックされると、関数と変数の両方が存在します。このように宣言された変数の実際の寿命はどれくらいですか?彼らはいつ破壊されますか?アプリケーションが終了するまで、それらは存在しますか?ベストプラクティスとリファレンスは高く評価されています。

4

2 に答える 2

3

ブロックスコープで慣れ親しんだ言語のように動作することを期待しています。Douglas Crockford の著書「The Good Parts」を読んで、すべてがこのように機能する理由をよりよく理解することをお勧めします。これらすべてを最初から学べば、将来はずっと楽になります。

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

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

この例では、グローバル スコープの変数であるため、関数が test を変更できることがわかります。

var test = "peanut butter";
var foo = function() {
    test = "Apple sauce";
};

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

1: あなたが行ったように、任意の関数の外に var ステートメントを配置します。

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

window.foo = value;

3. 変数を宣言せずに使用します。これは暗黙のグローバルです。これらには本当に気をつけてください。宣言した関数は、実際には「クリックハンドラー」と呼ばれる暗黙のグローバルそのものです。

foo = value;

グローバル変数の使用を最小限に抑えるための一般的な方法は、グローバル削減と呼ばれ、アプリケーション固有のグローバル変数を定義して残りのグローバル変数を保持し、他のライブラリとの衝突を回避します。これは、オブジェクト リテラルを宣言し、グローバル変数を作成する 2 番目の方法を使用して行います。ただし、これはグローバル変数が必要な場合にのみ使用し、可能な場合は機能スコープに固執するようにしてください。

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

JavaScript の世界に深く入り込むと、クロージャなど、コードをきれいに整理するための便利な機能について学び始めます。

JavaScript が典型的な古典的な言語のように機能するとは思わないでください。JavaScript はそれ自体が強力な言語であり、まったく異なるものであることがわかります。

旅の途中で、ツールJSLintを使用して、コードがコンパイルされていないために表示されない規則やエラーに従っているかどうかをテストすることをお勧めします。

于 2012-04-10T21:36:41.937 に答える
1

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

于 2012-04-10T21:12:48.960 に答える