इसका क्या मतलब है कि वैश्विक नाम स्थान प्रदूषित होगा?
मैं वास्तव में यह नहीं समझता कि वैश्विक नाम स्थान प्रदूषित होने का क्या मतलब है।
जवाबों:
कचरा संग्रहण पर त्वरित ध्यान दें
चूंकि चर गुंजाइश खो देते हैं, वे कचरा संग्रहण के लिए पात्र होंगे। यदि उन्हें वैश्विक स्तर पर स्कोप किया जाता है, तो वे तब तक संग्रह के लिए पात्र नहीं होंगे जब तक कि वैश्विक नाम स्थान की गुंजाइश कम न हो जाए।
यहाँ एक उदाहरण है:
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
इसे आपके वैश्विक नामस्थान (कम से कम मेरे लिए) में जोड़कर 10,000 kb मेमोरी उपयोग (win7 फ़ायरफ़ॉक्स) करना चाहिए जो एकत्र नहीं किया जाएगा। अन्य ब्राउज़र इसे अलग तरीके से संभाल सकते हैं।
जबकि उस दायरे में समान कोड होना जो इस तरह के दायरे से बाहर हो जाता है:
(function(){
var arra = [];
for (var i = 0; i < 2003000; i++) {
arra.push(i * i + i);
}
})();
arraबंद होने के बाद गुंजाइश खोने की अनुमति देगा और कचरा संग्रह के लिए पात्र होगा।
ग्लोबल नेमस्पेस आपका दोस्त है
वैश्विक नामस्थान का उपयोग करने के खिलाफ कई दावों के बावजूद, यह आपका मित्र है। और एक अच्छे दोस्त की तरह आपको अपने रिश्ते का दुरुपयोग नहीं करना चाहिए।
नेक बनो
दुरुपयोग न करें (आमतौर पर "प्रदूषणकारी" के रूप में जाना जाता है) वैश्विक नाम स्थान। और मेरा मतलब है कि वैश्विक नाम स्थान का दुरुपयोग न करें - एकाधिक वैश्विक चर न बनाएं। यहां वैश्विक नामस्थान का उपयोग करने का एक बुरा उदाहरण है।
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);
यह 11 वैश्विक वैरिएबल बनाने जा रहा है, जो संभवतः कहीं पर अधिलेखित या गलत हो सकते हैं।
साधन संपन्न बनो
एक अधिक संसाधनपूर्ण दृष्टिकोण, जो वैश्विक नाम स्थान को प्रदूषित नहीं करता है, यह सब मॉड्यूल पैटर्न में लपेटना होगा और केवल एक वैश्विक चर का उपयोग करते हुए कई चर को उजागर करना होगा।
यहाँ एक उदाहरण है: (कृपया ध्यान दें कि यह सरल है और कोई त्रुटि नहीं है)
//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()दायरे के बाहर उदाहरण के लिए उपयोग किया था ? इस समस्या के करीब एक और अवधारणा को समझना बहुत सही होगा!
जावास्क्रिप्ट में, एक फ़ंक्शन के बाहर की घोषणाएं वैश्विक दायरे में हैं। इस छोटे उदाहरण पर विचार करें:
var x = 10;
function example() {
console.log(x);
}
example(); //Will print 10
उपरोक्त उदाहरण xमें, वैश्विक दायरे में घोषित किया गया है। कोई भी चाइल्ड स्कोप, जैसे कि exampleफंक्शन द्वारा बनाया गया , किसी भी पैरेंट स्कोप में घोषित चीजों को प्रभावी रूप से विरासत में मिला (इस मामले में, यह सिर्फ ग्लोबल ऑपरेशंस है)।
कोई भी बच्चा गुंजाइश जो वैश्विक दायरे में घोषित एक चर redeclares, वैश्विक चर को छाया देगा, संभवतः अवांछित, हार्ड को बग्स को ट्रैक करने के लिए:
var x = 10;
function example() {
var x = 20;
console.log(x); //Prints 20
}
example();
console.log(x); //Prints 10
वैश्विक चर आमतौर पर इस तरह की समस्याएं पैदा करने की क्षमता के कारण अनुशंसित नहीं होते हैं। यदि हम फ़ंक्शन के varअंदर स्टेटमेंट का उपयोग नहीं करते हैं example, तो हम गलती xसे वैश्विक दायरे में मूल्य को अधिलेखित कर देंगे :
var x = 10;
function example() {
x = 20; //Oops, no var statement
console.log(x); //Prints 20
}
example();
console.log(x); //Prints 20... oh dear
यदि आप अधिक पढ़ना चाहते हैं और इसे ठीक से समझना चाहते हैं, तो मेरा सुझाव है कि आप ECMAScript विनिर्देश के माध्यम से जा रहे हैं । यह पढ़ने में सबसे रोमांचक नहीं हो सकता है लेकिन यह कोई अंत नहीं होगा।
जब आप वैश्विक चर, कार्य आदि घोषित करते हैं, तो वे, अहम्, वैश्विक नामस्थान पर जाते हैं। प्रदर्शन / मेमोरी के मुद्दों (जो उत्पन्न हो सकता है) के अलावा, आप दुर्भाग्यपूर्ण नाम के टकराव में चलने की संभावना रखते हैं, जब आप एक महत्वपूर्ण चर को फिर से परिभाषित करेंगे या आपके द्वारा उपयोग किए जाने वाले मूल्य का उपयोग न करें।
वैश्विक नाम स्थान में चीजों को परिभाषित करने से बचना है।