Co to znaczy, że globalna przestrzeń nazw byłaby zanieczyszczona?Co to znaczy, że globalna przestrzeń nazw byłaby zanieczyszczona?
Nie do końca rozumiem, co oznacza globalna przestrzeń nazw zanieczyszczona.
Co to znaczy, że globalna przestrzeń nazw byłaby zanieczyszczona?Co to znaczy, że globalna przestrzeń nazw byłaby zanieczyszczona?
Nie do końca rozumiem, co oznacza globalna przestrzeń nazw zanieczyszczona.
Quick Note On Garbage Collection
jako zmienne stracić zakresu, będą kwalifikować się do zbierania śmieci. Jeśli mają zasięg globalny, nie będą się kwalifikować do gromadzenia, dopóki globalny obszar nazw nie zostanie stracony.
Oto przykład:
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
Dodanie tego do globalnej przestrzeni nazw (przynajmniej dla mnie) powinien reklam 10000 kb zużycie pamięci (Win7 Firefox), które nie będą zbierane. Inne przeglądarki mogą obsługiwać to inaczej.
Zważywszy posiadające ten sam kod w zakres wykraczający poza zakres tak:
(function(){
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
})();
pozwoli arra
stracić zakresu po zamknięciu wykonuje i kwalifikuje się do zbierania śmieci.
Globalny nazw jest twoim przyjacielem
Pomimo wielu zastrzeżeń przeciwko użyciu globalnej przestrzeni nazw, to jest twój przyjaciel. I jak dobry przyjaciel, nie powinieneś nadużywać swojego związku.
Be Gentle
Nie nadużywać (zazwyczaj określane jako "zanieczyszczających") przestrzeni nazw globalnych. I o co mi chodzi, nie nadużywaj globalnej przestrzeni nazw - nie twórz wielu zmiennych globalnych. Oto przykład użycia globalnej przestrzeni nazw.
var x1 = 5;
var x2 = 20;
var y1 = 3
var y2 = 16;
var rise = y2 - y1;
var run = x2 - x1;
var slope = rise/run;
var risesquared = rise * rise;
var runsquared = run * run;
var distancesquared = risesquared + runsquared;
var distance = Math.sqrt(dinstancesquared);
Spowoduje to utworzenie 11 zmiennych globalnych, które mogą ewentualnie zostać nadpisane lub źle zinterpretowane.
Bądź pomysłowy
Bardziej pomysłowy podejścia, które nie zanieczyszcza globalnej przestrzeni nazw, byłoby zawinąć to wszystko w strukturze modułu i używać tylko jednej zmiennej globalnej, narażając jednocześnie wielu zmiennych.
Oto przykład: (proszę pamiętać, że jest prosty i nie ma obsługi błędów)
//Calculate is the only exposed global variable
var Calculate = function() {
//all defintions in this closure are local, and will not be exposed to the global namespace
var Coordinates = [];//array for coordinates
var Coordinate = function (xcoord, ycoord) {//definition for type Coordinate
this.x = xcoord;//assign values similar to a constructor
this.y = ycoord;
};
return {//these methods will be exposed through the Calculate object
AddCoordinate: function (x, y) {
Coordinates.push(new Coordinate(x, y));//Add a new coordinate
},
Slope: function() {//Calculates slope and returns the value
var c1 = Coordinates[0];
var c2 = Coordinates[1];
return c2.y - c1.y/c2.x - c1.x;//calculates rise over run and returns result
},
Distance: function() {
//even with an excessive amount of variables declared, these are all still local
var c1 = Coordinates[0];
var c2 = Coordinates[1];
var rise = c2.y - c1.y;
var run = c2.x - c1.x;
var risesquared = rise * rise;
var runsquared = run * run;
var distancesquared = risesquared + runsquared;
var distance = Math.sqrt(distancesquared);
return distance;
}
};
};
//this is a "self executing closure" and is used because these variables will be
//scoped to the function, and will not be available globally nor will they collide
//with any variable names in the global namespace
(function() {
var calc = Calculate();
calc.AddCoordinate(5, 20);
calc.AddCoordinate(3, 16);
console.log(calc.Slope());
console.log(calc.Distance());
})();
Przechowywanie zmiennych w zamknięciu zapewnia, że są gromadzone śmieci. – theJava
Bardzo interesująca odpowiedź, czy możesz wyjaśnić nam, jaka jest różnica między wykorzystaniem zwrotu, tak jak w twoim zasięgu, i użyciem na przykład 'Calculate.prototype.Slope()' poza zakresem? Byłoby bardzo dobrze zrozumieć inną koncepcję zbliżoną do tego problemu! – Ludo
Dzięki za to dobre wyjaśnienie. Szybkie pytanie: Co chciałbyś zobaczyć na temat obsługi błędów w tym fragmencie? – Sentenza
Kiedy deklarujesz zmienne globalne, funkcje itd., One, ehm, idą do globalnej przestrzeni nazw. Pomijając problemy z wydajnością/pamięcią (które mogą się pojawić), najprawdopodobniej natkniesz się na niefortunne zderzenie nazw, kiedy na nowo zdefiniujesz ważną zmienną lub użyjesz wartości, której nie chcesz użyć.
Należy unikać definiowania elementów w globalnym obszarze nazw.
Jednym ze sposobów uniknięcia definiowania rzeczy w globalnej przestrzeni nazw jest użycie zmiennych lokalnych (zadeklarowanych za pomocą "var" w funkcji), ale wtedy zmienna jest ... lokalna dla funkcji. Należy to zrobić w miarę możliwości. –
W języku JavaScript deklaracje poza funkcją znajdują się w zasięgu globalnym. Rozważmy następujący przykład: mały
var x = 10;
function example() {
console.log(x);
}
example(); //Will print 10
W powyższym przykładzie, x
jest zadeklarowana w zasięgu globalnym. Dowolny zakres podrzędny, taki jak stworzony przez funkcję example
, skutecznie dziedziczy obiekty zadeklarowane w dowolnych zakresach nadrzędnych (w tym przypadku jest to zasięg globalny).
Wszelkie zakres dziecko, które redeclares zmienna zadeklarowana w zakresie globalnym będzie śledzony zmienną globalną, potencjalnie powodując niepożądanych, twardych do śledzenia błędów:
var x = 10;
function example() {
var x = 20;
console.log(x); //Prints 20
}
example();
console.log(x); //Prints 10
zmienne globalne są zwykle nie zalecane ze względu na możliwość spowodowania takie problemy. Jeśli nie użyć instrukcji wewnątrz funkcji example
var
, mielibyśmy przypadkowo nadpisane wartość x
w zakresie globalnym:
var x = 10;
function example() {
x = 20; //Oops, no var statement
console.log(x); //Prints 20
}
example();
console.log(x); //Prints 20... oh dear
Jeśli chcesz dowiedzieć się więcej i zrozumieć go prawidłowo, proponuję przeżywa ECMAScript specification. To może nie być najbardziej ekscytujące z odczytów, ale to nie pomoże.
Łączenie na przyszłość: [JavaScript deklaracji przestrzeni nazw] (http://stackoverflow.com/q/2504568/320399) – blong