2011-06-20 9 views
0

私はjavascriptで使うことができるいくつかのconstグローバル変数を持っていますが、私はこのコードを出して、その中で言及されているいくつかの回答から取り上げています。しかし、私はどこかで目にすることができなかった小さな間違いがあるようです。誰かがこれで私を助けることができますか? testQuery.jsJavaScriptの定数変数

(function (window, undefined) { 

    var testQuery = function(obj) { 
     if (!(this instanceof testQuery)) { 
      return new testQuery(obj); 
     } 
    } 

    var MYGLOBALS = function() { 
     var globals = { 
      foo : "bar", 
      batz : "blah"   
     } 

     return { 
      getValue : function(s) { 
       return globals[s]; 
      } 
     } 
    }(); 

    window.testQuery = testQuery; 

}) (window); 

と私はこのコード行を持っているJavaScriptのタグHTML内で

。 testQuery.htmlで

<html> 
    <head> 
    <script src="testQuery.js"></script> 
    <script> 

     function onClick() { 

      alert(MYGLOBALS.getValue("foo")); 
     } 

    </script> 
    </head> 

    <body> 

     <input type="button" onclick="onClick()"> 

    </body> 

</html> 
+0

あなたは間違いがあると思いますか?どのようなエラー出力/動作が得られていますか、何を期待しましたか? –

+0

@Andrzej Doyle私は、コードから理解できるものから 'bar'を返すポップアップボックスを期待しています。しかし、それは私が理解するものに応答していないようです。 –

+0

誤解を招くほど(と一貫性のない)字下げであったかもしれないと理解している問題の一部です。私はインデントをより標準的にするように更新しました。これは助けになるかもしれません。 **編集**:そして今私はもう一度やった(あなたの編集はそれを拭き取った)。 –

答えて

3

ファイル変数MYGLOBALSは、あなたのスコープ機能(名前のない大一番外側の関数)に対してローカルであるので、それだけでその関数内からアクセスすることができます。

"... html javascriptタグで..."とはどういう意味かわかりませんが、引用したalertがその有効範囲の外にある場合はMYGLOBALSが範囲外です。


更新:JavaScriptのスコープについての事は、それは人々がそれだと思うよりも、はるかに簡単だということです。 varで宣言された変数は、スコープ(関数またはグローバル; JavaScriptにはブロックレベルのスコープがないため、{}で定義されていません)とそのスコープのサブスコープ(例:それの中で定義する)。スコープは完全に字句   —です。つまり、ソースコードに表示されているものであり、他の実行時構造ではありません。明示的にtestQueryというプロパティをwindowにしてグローバル変数を明示的にするwindow.testQuery = testQuery;行のように、明示的にどこかでコードが表示されない限り、そのスコープからポップアウトすることはありません。 (そしてその後も、それは変数は、あなたがより広くアクセス可能である同じ事を参照新しいプロパティを作成しただけのことを、スコープの外にポップされたことはありません。)


更新2:あなたのコメントを再

実は私は何をしようとしていますが、あなたがに置くことができ、最終的な静的な整数が存在するであろう他の言語でのプログラミングをしている時に見るもののようなものを作成することですあなたが呼び出した関数のパラメータフィールド。それを行う良い方法はありますか?たとえば、ビジュアルベーシックでは、me.background = Color.YELLOWのようなものです。私が望むのは、その黄色を表す静的変数を持つことです。

JavaScriptにはユーザー定義の定数はなく、列挙型はありません。 (更新:それらのものの両方がES6で変更されることがあります。)あなたが代わりに行うことは例えば、プロパティを持つオブジェクトを定義している:

var COLORS = { 
    RED: "#FF0000", 
    BLUE: "#0000FF", 
    // ... 
    GREEN: "#00FF00" 
}; 

は、これらの定数ではありませんから、誰を保つために何もありませんあなたがあなたに言っていることを除いてCOLORS.REDに割り当ててください。

(更新:ES5では、我々はこのように、Object.definePropertiesを使用してこれらのプロパティを一定にすることができます。あなたは、デフォルトでは、それは書き込み可能ではない方法で、プロパティを定義するとき

var COLORS = Object.defineProperties({}, { 
    RED: {value: "#FF0000"}, 
    BLUE: {value: "#0000FF"}, 
    // ... 
    GREEN: {value: "#00FF00"} 
}); 

あなたがしていることは、値がオブジェクトである単一のグローバルシンボルを持つモジュールパターンと、それ以外のオブジェクトはそのオブジェクトのプロパティです:

(function() { 
    var mod; 

    // Create the global, and also give ourselves a convenient alias for it (`mod`) 
    window.MyModule = mod = {}; 

    // Colors 
    mod.COLORS = { 
     RED: "#FF0000", 
     BLUE: "#0000FF", 
     // ... 
     GREEN: "#00FF00" 
    }; 

    mod.testQuery = MyModule_testQuery; 
    function MyModule_testQuery() { 
     // Do something 
    } 

})(); 

alert(MyModule.COLORS.RED); // #FF0000 
MyModule.testQuery();  // Do something 

それともtestQuery機能は次のように定義することができることを、あなたが好む場合:

mod.testQuery = function() { 
     // Do something 
    }; 

...しかし、その関数が匿名である、と私はnot a fan of anonymous functionsです。 (名前MyModule_testQueryについて特別何もない、それは純粋に私の命名規則だということに注意してください。)


やや話題オフ:私たちは上記のグローバルシンボルを公開している。このラインについて

// Create the global, and also give ourselves a convenient alias for it (`mod`) 
window.MyModule = mod = {}; 

これは、ブラウザ環境に固有のことです。私たちは、些細な変更で任意のJavaScript環境には適用作ることができます:

// Create the global, and also give ourselves a convenient alias for it (`mod`) 
this.MyModule = mod = {}; 

我々は、最も外側のスコープの関数を呼び出すものだから働き、そして私たちは、我々は、特定のでそれを呼び出していないことを知っていますthis値(いくつかの他の言語  —とは異なりthisのJavaScript  で—は、関数が呼び出された方法によって完全にを決定し、ではないどこか、それが定義されていますか)。したがって、特別な値を使用していないことがわかっているので、JavaScriptが動作するため、グローバルオブジェクトになります。グローバルオブジェクトは、Webブラウザ上のwindowです(実質的には、windowは、それ自体を参照するグローバルオブジェクトのプロパティです)。

+0

@ T.J。クラウダーですが、この行はありませんwindow.testQuery = testQuery;スコープ外でこの全体の機能にアクセスできるようにしますか? –

+0

@imimified:これは関数の外側で 'window.testQuery'シンボルをアクセス可能にします(' testQuery'を 'window'のプロパティ、例えばグローバル変数にします)。 「MYGLOBALS」にはまったく影響がありません。 –

+0

@ T.J Crowderは、これはmyglobalsにアクセスするためにtestQueryを参照する必要があることを意味しますか? testQuery.MYGLOBALSのようなものか何か? –

1

http://jsfiddle.net/vXu7m/1/

いくつかの構文のクリーンアップ、およびwindowオブジェクトにあなたMYGLOBALSを取り付けることは、あなたが欲しいものを行う必要があります。