Küresel ad alanının kirleneceği ne anlama geliyor?
Küresel ad alanının kirlenmesinin ne anlama geldiğini gerçekten anlamıyorum.
Yanıtlar:
Çöp Toplama Hakkında Hızlı Not
Değişkenler kapsamını yitirdikçe, çöp toplama için uygun olacaktır. Kapsamı genel olarak belirlenmişse, genel ad alanı kapsamını kaybedene kadar koleksiyon için uygun olmayacaktır.
İşte bir örnek:
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
Bunu genel ad alanınıza eklemek (en azından benim için) toplanmayacak 10.000 kb bellek kullanımı (win7 firefox) eklemelidir. Diğer tarayıcılar bunu farklı şekilde ele alabilir.
Oysa aynı koda şu şekilde kapsam dışında kalan bir kapsamda sahip olmak:
(function(){
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
})();
arraKapanış çalıştırıldıktan sonra kapsamın kaybolmasına izin verecek ve çöp toplama için uygun olacaktır.
Global Ad Alanı Arkadaşınızdır
Küresel ad alanını kullanmayla ilgili birçok iddiaya rağmen, bu senin arkadaşın. Ve iyi bir arkadaş gibi, ilişkinizi kötüye kullanmamalısınız.
Nazik olmak
Genel ad alanını kötüye kullanmayın (genellikle "kirletme" olarak anılır). Ve küresel ad alanını kötüye kullanma ile kastettiğim - birden çok global değişken oluşturmayın. İşte global ad alanını kullanmanın kötü bir örneği.
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);
Bu, muhtemelen üzerine yazılabilecek veya bir yerde yanlış yorumlanabilecek 11 küresel değişken oluşturacak.
Becerikli Olun
Global isim alanını kirletmeyen daha becerikli bir yaklaşım, hepsini modül modeline sarmak ve birden çok değişkeni açığa çıkarırken yalnızca bir global değişken kullanmak olacaktır.
İşte bir örnek: (Lütfen bunun basit olduğunu ve herhangi bir hata işleme olmadığını unutmayın)
//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());
})();
Calculate.prototype.Slope()kapsam dışında kullanmak arasındaki farkı bize açıklayabilir misiniz ? Bu problematiğe yakın başka bir kavramı anlamak çok mükemmel olurdu!
JavaScript'te, bir işlevin dışındaki bildirimler genel kapsamdadır. Şu küçük örneği düşünün:
var x = 10;
function example() {
console.log(x);
}
example(); //Will print 10
Yukarıdaki örnekte x, genel kapsamda beyan edilmiştir. exampleİşlev tarafından oluşturulanlar gibi herhangi bir alt kapsam, herhangi bir üst kapsamda bildirilen şeyleri etkin bir şekilde devralır (bu durumda, bu yalnızca genel kapsamdır).
Genel kapsamda bildirilen bir değişkeni yeniden bildiren herhangi bir alt kapsam, genel değişkeni gölgeleyecek ve potansiyel olarak istenmeyen, izlenmesi zor hatalara neden olacaktır:
var x = 10;
function example() {
var x = 20;
console.log(x); //Prints 20
}
example();
console.log(x); //Prints 10
Küresel değişkenler, böyle sorunlara neden olma potansiyeli nedeniyle genellikle tavsiye edilmez. Fonksiyonun variçindeki ifadeyi kullanmasaydık, exampleyanlışlıkla xgenel kapsamdaki değerinin üzerine yazmış olurduk :
var x = 10;
function example() {
x = 20; //Oops, no var statement
console.log(x); //Prints 20
}
example();
console.log(x); //Prints 20... oh dear
Daha fazlasını okumak ve doğru bir şekilde anlamak istiyorsanız, ECMAScript spesifikasyonunu incelemenizi öneririm . Okumaların en heyecan verici kısmı olmayabilir ama sonu gelmez.
Global değişkenleri, fonksiyonları vb. Bildirdiğinizde, bunlar, ehm, global ad alanına gider. Performans / bellek sorunlarının yanı sıra (ortaya çıkabilecek), önemli bir değişkeni yeniden tanımladığınızda veya kullandığınızı düşündüğünüz değeri kullanmayacağınız zaman, talihsiz bir ad çatışmasıyla karşılaşmanız muhtemeldir.
Global isim alanındaki şeyleri tanımlamaktan kaçınılmalıdır.