2010-03-20 19 views
26
function test(){ 
    if(true){ 
     var a = 5; 
    } 
    alert(a); 
} 

test(); 

मैं जब मैं JsLint जो कोई अर्थ नहीं है.तो के लिए मैं जल्दी से एक उदाहरण बनाया के साथ जांच मेरी जे एस कोड में त्रुटियों 'दायरे से बाहर' जा रहे हैं। क्या इस कोड के टुकड़े में वास्तव में कुछ गलत है, क्योंकि वैरिएबल अंततः फ़ंक्शन के शीर्ष पर फिसल जाता है।JsLint 'क्षेत्र से बाहर' त्रुटि

+0

तो यह एक चेतावनी का अधिक है। – Rajat

+2

जेएसलिंट की कई "त्रुटियां" वास्तव में इस अर्थ में केवल चेतावनियां हैं कि वे जावास्क्रिप्ट भाषा त्रुटियां नहीं हैं और रनटाइम पर आवश्यक रूप से विफल नहीं होंगे। उन्हें त्रुटियां कहा जाता है क्योंकि डगलस क्रॉकफोर्ड उन्हें बुरी आदत मानते हैं। –

उत्तर

34

जबकि var फ़ंक्शन में एक चर को स्थानांतरित करता है और होस्टिंग के अधीन है, अधिकांश भाषाओं में ब्लॉक स्कोप होता है और कार्यक्षेत्र नहीं होता है।

किसी ब्लॉक के अंदर विविध कीवर्ड का उपयोग करके, लेकिन उस ब्लॉक के बाहर चर का उपयोग करके, आपने एक ऐसा निर्माण बनाया है जो उस जेएस idiosyncrasy से परिचित लोगों को भ्रमित कर सकता है।

Douglas Crockford recommends एक फ़ंक्शन के शीर्ष पर एक एकल var कथन का उपयोग करके जो उस फ़ंक्शन पर स्कॉप्ड किए जाने वाले सभी चर निर्दिष्ट करता है।

function test(){ 
    var a; 
    if(true){ 
     a = 5; 
    } 
    alert(a); 
} 

test(); 
कई चर के साथ

आप होगा:

function foo() { 
    var a, b, c, d = "only d has an initial value", e; 
    // … 
} 
+14

डगलस क्रॉकफोर्ड * बहुत सारी चीजों की सिफारिश करता है ... किसी भी उपकरण के साथ आपको हमेशा नमक के अनाज के साथ जेएसलिंट की सिफारिशें लेनी चाहिए, और उन्हें आपकी/आपकी टीम के अनुरूप बनाना चाहिए। यदि आपकी टीम के सभी लोग समझते हैं कि जेएस वैरिएबल स्कोपिंग कैसे काम करती है, तो हर तरह से आपको अपने "var" कथन कहां रखना है, इस पर क्रॉकफोर्ड की सिफारिशों को अनदेखा करना चाहिए। – machineghost

5

कोड है कि आप ने लिखा है काम कर रहा है। यह सिर्फ बहुत पठनीय/रखरखाव योग्य नहीं है। if के दायरे के अंदर परिवर्तनीय a घोषित करने से झूठी इंप्रेशन हो सकती है कि a केवल इस दायरे के अंदर दिखाई दे रहा है (जो, जैसा कि यह प्रोग्राम दिखाता है, सत्य नहीं है - a पूरे फ़ंक्शन में दिखाई देगा)।

यह JsLint चेतावनी के रूप में निम्नानुसार, सटीक गुंजाइश जहां चर वास्तव में प्रयोग किया जाता है पर घोषणा जगह करने के लिए प्रोत्साहित:

function test(){ 
    var a; 
    if(true){ 
     a = 5; 
    } 
    alert(a); 
} 
+0

उम्म ... 'var = null' ?? – Quentin

+0

संभवतः यह एक टाइपो है और 'var a = null' होना चाहिए। – eyelidlessness

+0

धन्यवाद, इसे ठीक किया गया। –

1

जावास्क्रिप्ट समारोह गुंजाइश है और गुंजाइश ब्लॉक नहीं। इसलिए, यदि चर ब्लॉक के बाहर और फ़ंक्शन के भीतर फ़ंक्शन दृश्यमान और सुलभ है, तो कथन घोषित किया गया है।

जेएसलिंट और जेएसबीएन जैसे ऑनलाइन कंपाइलर चेतावनियां देते हैं लेकिन वे त्रुटियां नहीं हैं।

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