Wir haben eine Menge Setup-JS-Code, der Bedienfelder, Schaltflächen usw. definiert, die in vielen anderen JS-Dateien verwendet werden.
Typischerweise machen wir so etwas wie:
grid.js
var myGrid = .....
combos.js
var myCombo = .....
Dann in unserem Anwendungscode, wir:
application.js
function blah() {
myGrid.someMethod()
}
someother.js
function foo() {
myCombo.someMethod();
myGrid.someMethod();
}
Also, sollten wir die var myGrid
oder ist besser zu verwenden window.myGrid
Was ist der Unterschied?
Ich würde vorschlagen, eine Namespace-Variable var App = {};
App.myGrid = ...
Auf diese Weise können Sie die Verschmutzung des globalen Namespaces begrenzen.
EDIT: In Bezug auf die Anzahl der Variablen Problem - 2 mögliche Lösungen in den Sinn kommen:
bsp .: Sie haben
function foo() {
myCombo.someMethod();
myGrid.someMethod();
}
wird:
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();
auf diese Weise begrenzen Sie die Anzahl der kleinen Objekte und belichten nur das, was Sie benötigen (nämlich die Funktion foo).
PS: Wenn Sie die internen Komponenten verfügbar machen müssen, fügen Sie diese in der Konstruktorfunktion hinzu
Ein potenziell wichtiger Unterschied in der Funktionalität ist, dass window.myGrid
kann delete
d sein, und var myGrid
kann nicht.
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 )
Eine nette Verwendung von window.variable
ist, dass Sie es überprüfen können, ohne einen Javascript-Fehler zu haben. Zum Beispiel, wenn Sie:
if (myVar) {
//do work
}
und myVar
ist nirgendwo auf der Seite definiert, erhalten Sie einen Javascript-Fehler. Jedoch:
if (window.myVar) {
//do work
}
gibt keinen fehler und funktioniert wie man es erwarten würde.
var myVar = 'test'
und window.myVar = 'test'
sind ungefähr gleichwertig.
Abgesehen davon sollten Sie, wie bereits erwähnt, von einem globalen Objekt abstammen, um eine Verschmutzung des globalen Namespaces zu vermeiden.
In globaler Hinsicht sind die beiden Funktionen tatsächlich gleichwertig. Im Funktionsumfang ist var
sicherlich vorzuziehen, wenn das Verhalten von Abschlüssen gewünscht wird.
Ich würde nur die ganze Zeit var
verwenden: Erstens entspricht es dem normalerweise bevorzugten Verhalten in Closures (sodass es einfacher ist, Ihren Code in einen Closure zu verschieben, wenn Sie sich später dafür entscheiden), und zweitens Ich finde es nur semantischer zu sagen, dass ich eine Variable erstelle, als eine Eigenschaft des Fensters anzuhängen. Aber zu diesem Zeitpunkt ist es meistens Stil.
Die allgemeine Antwort auf die Frage wäre var
.
Setzen Sie Ihren Code immer in ein Sofort aufgerufener Funktionsausdruck (IIFE) :
(function(){
var foo,
bar;
...code...
})();
Dies verhindert, dass Variablen wie foo
und bar
den globalen Namespace verschmutzen. Wenn Sie dann explizit möchten, dass eine Variable auf dem globalen Objekt ist (normalerweise window
), können Sie Folgendes schreiben:
window.foo = foo;
JavaScript hat einen Funktionsumfang, und es ist sehr gut, ihn voll auszunutzen. Sie möchten nicht, dass Ihre App kaputt geht, nur weil ein anderer Programmierer so etwas Dummes getan hat, als ob er Ihr Timer-Handle überschrieben hätte.
Zusätzlich zu anderen Antworten ist es erwähnenswert, dass wenn Sie var
nicht innerhalb einer Funktion verwenden, während Sie eine Variable deklarieren, ndicht in den globalen Bereich, wodurch sie automatisch zu einer Eigenschaft von window
object (oder globalem Bereich) wird. .
Um zu erweitern, was Liviu sagte, verwenden Sie:
App = (function() {
var exports = {};
/* code goes here, attach to exports to create Public API */
return exports;
})();
Auf diese Weise können Sie einen Teil Ihres implementierungsspezifischen Codes verbergen, den Sie möglicherweise nicht anzeigen möchten, indem Sie var
verwenden. Sie können jedoch auf alles zugreifen, was an das Objekt exports
angehängt ist.