他の多くのJSファイルで使用されるパネル、ボタンなどを定義する多くのセットアップJSコードがあります。
通常、次のようなことを行います。
grid.js
var myGrid = .....
combos.js
var myCombo = .....
次に、アプリケーションコードで、次のことを行います。
application.js
function blah() {
myGrid.someMethod()
}
someother.js
function foo() {
myCombo.someMethod();
myGrid.someMethod();
}
したがって、var myGrid
を使用するか、window.myGrid
を使用する方が良いでしょうか
違いは何ですか?
名前空間変数var App = {};
を作成することをお勧めします
App.myGrid = ...
これにより、グローバル名前空間の汚染を制限できます。
編集:変数の問題について-2つの可能な解決策が思い浮かびます:
例:あなたは持っています
function foo() {
myCombo.someMethod();
myGrid.someMethod();
}
になる:
var Foo = function(combo, grid) {
var myCombo = combo;//will be a private property
this.myGrid = grid;//will be a public property
this.foo = function() {//public method
myCombo.someMethod();
myGrid.someMethod();
}
}
App.myFoo = new Foo(someCombo, someGrid);
App.myFoo.foo();
このようにして、小さなオブジェクトの量を制限し、必要なものだけを公開します(つまり、foo関数)
PS:内部コンポーネントを公開する必要がある場合は、コンストラクタ関数内でこれに追加します
機能の潜在的に重要な違いは、window.myGrid
はdelete
dであり、var myGrid
できません。
var test1 = 'value';
window.test2 = 'value';
console.log( delete window.test1 ); // false ( was not deleted )
console.log( delete window.test2 ); // true ( was deleted )
console.log( test1 ); // 'value' ( still accessible )
console.log( test2 ); // ReferenceError ( no longer exists )
window.variable
の便利な使用法の1つは、javascriptエラーなしでチェックできることです。たとえば、次の場合:
if (myVar) {
//do work
}
myVar
がページのどこにも定義されていない場合、javascriptエラーが発生します。しかしながら:
if (window.myVar) {
//do work
}
エラーは発生せず、期待どおりに機能します。
var myVar = 'test'
とwindow.myVar = 'test'
はほぼ同等です。
それとは別に、他の人が言ったように、グローバル名前空間を汚染しないように、1つのグローバルオブジェクトから派生する必要があります。
グローバルスコープでは、2つは実際には機能的に同等です。関数スコープでは、クロージャーの動作が必要な場合、var
が確実に望ましいです。
常にvar
を使用します。まず、クロージャーで通常好まれる動作と一貫性があります(したがって、後で行う場合はクロージャーにコードを移動しやすくなります)。ウィンドウのプロパティをアタッチするよりも変数を作成していると言ったほうが意味があります。しかし、この時点ではほとんどがスタイルです。
この質問に対する一般的な答えは、var
を使用することです。
より具体的には、常にコードを Immediately Invoked Function Expression(IIFE) に入れます。
(function(){
var foo,
bar;
...code...
})();
これにより、foo
やbar
などの変数がグローバル名前空間を汚染しないようにします。次に、グローバルオブジェクト(通常window
)上にある変数を明示的にwantする場合、次のように記述できます。
window.foo = foo;
JavaScriptには機能的なスコープがあり、それを最大限に活用するのは本当に良いことです。他のプログラマーがタイマーハンドルを上書きしたような愚かなことをしたからといって、アプリが壊れるのは望ましくありません。
他の答えに加えて、変数の宣言中に関数内でvar
を使用しない場合、それはleaksを自動的にwindow
オブジェクト(またはグローバルスコープ)のプロパティにすることです。
Liviuが言ったことを拡張するには、次を使用します。
App = (function() {
var exports = {};
/* code goes here, attach to exports to create Public API */
return exports;
})();
そうすることで、実装固有のコードの一部を隠すことができます。コードは、var
の内部を使用して公開したくない場合があります。ただし、exports
オブジェクトにアタッチされたものにはアクセスできます。