2012-01-14 12 views
68

इसका मतलब क्या है कि वैश्विक नामस्थान प्रदूषित हो जाएगा?इसका मतलब क्या है कि वैश्विक नामस्थान प्रदूषित हो जाएगा?

मैं वास्तव में समझ नहीं पा रहा हूं कि वैश्विक नामस्थान प्रदूषित साधनों का क्या अर्थ है।

+0

भविष्य में संदर्भ के लिए लिंक करना: [जावास्क्रिप्ट नाम स्थान घोषणा] (http://stackoverflow.com/q/2504568/32039 9) – blong

उत्तर

93

कूड़ा संग्रह

पर त्वरित नोट के रूप में चर गुंजाइश खो देते हैं, वे कचरा संग्रहण के लिए पात्र होंगे। यदि वे वैश्विक रूप से स्कॉप्ड हैं, तो वे तब तक संग्रह के लिए पात्र नहीं होंगे जब तक कि वैश्विक नामस्थान गुंजाइश न हो जाए। (कम से कम मेरे लिए) चाहिए विज्ञापन 10,000 स्मृति के उपयोग की केबी (फ़ायरफ़ॉक्स Win7) एकत्र नहीं किया जाएगा जो

var arra = []; 
for (var i = 0; i < 2003000; i++) { 
arra.push(i * i + i); 
} 

अपने ग्लोबल नेम स्पेस को यह जोड़ना:

यहाँ एक उदाहरण है। अन्य ब्राउज़र इसे अलग-अलग संभाल सकते हैं।

एक दायरे में है कि एक ही कोड है जो इस तरह दायरे से बाहर चला जाता है होने जबकि:

(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()); 
})(); 
+7

एक बंद के अंदर चर रखने से यह सुनिश्चित होता है कि वे कचरा एकत्रित हैं। – theJava

+1

बहुत ही रोचक उत्तर, क्या आप हमें बता सकते हैं कि आपके दायरे में किए गए रिटर्न का उपयोग करके betfen क्या अंतर है, और उदाहरण के लिए 'गणना करें .prototype.Slope() 'दायरे के बाहर? इस समस्याग्रस्त के करीब एक और अवधारणा को समझना बहुत सही होगा! – Ludo

+0

उस अच्छे स्पष्टीकरण के लिए धन्यवाद। त्वरित प्रश्न: आप उस स्निपेट में त्रुटि-संचालन के बारे में क्या देखना चाहेंगे? – Sentenza

6

जब आप वैश्विक चर, फ़ंक्शन इत्यादि घोषित करते हैं, तो वे, ehm, वैश्विक नामस्थान पर जाते हैं। प्रदर्शन/स्मृति समस्याओं (जो उत्पन्न हो सकता है) के अलावा, आप दुर्भाग्यपूर्ण नाम संघर्ष में भागने की संभावना रखते हैं, जब आप किसी महत्वपूर्ण चर को फिर से परिभाषित करेंगे या आपके द्वारा उपयोग किए जाने वाले मान का उपयोग नहीं करेंगे।

वैश्विक नामस्थान में चीजों को परिभाषित करना टालना है।

+1

वैश्विक नामस्थान में चीजों को परिभाषित करने से बचने का एक तरीका स्थानीय चर का उपयोग करना है (फ़ंक्शन के अंदर "var" के साथ घोषित), लेकिन फिर चर ... फ़ंक्शन के लिए स्थानीय है। यह जितना संभव हो किया जाना चाहिए। –

14

जावास्क्रिप्ट में, फ़ंक्शन के बाहर की घोषणा वैश्विक दायरे में हैं। इस छोटे से उदाहरण पर विचार करें:

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 

वैश्विक चर आमतौर पर संभावित की वजह से सिफारिश नहीं की जाती पैदा करने के लिए इस तरह की समस्याएं। हम example समारोह अंदर var बयान का उपयोग नहीं किया है, तो हम गलती से वैश्विक क्षेत्र में 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 specification। यह पढ़ने का सबसे रोमांचक नहीं हो सकता है लेकिन इससे कोई अंत नहीं होगा।

संबंधित मुद्दे