8

के बारे में शिकायत करते हुए जावास्क्रिप्ट, JSLint के माध्यम से चलाते समय मुझे चिल्लाता है और मुझे यकीन नहीं है कि क्यों।जेएसलिंट मेरी कोशिश/पकड़

/*jslint browser: true, devel: true, evil: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, newcap: true, immed: true */ 

var foo = function() { 
    try { 
    console.log('foo'); 
    } catch(e) { 
    alert(e); 
    } 

    try { 
    console.log('bar'); 
    } catch(e) { 
    alert(e); 
    } 
}; 

foo(); 

यह मुझसे कहता है: लाइन 12 चरित्र 11 पर

समस्या: 'ई' पहले से ही परिभाषित किया गया है।

} catch(e) {

यह है कि मैं एक दूसरे catch(e) है परेशान प्रतीत होता है। यह एक मुद्दा क्यों होगा? क्या यह कैच ब्लॉक के अंदर बस स्थानीय चर को सेट नहीं करता है? क्या मुझे किसी फ़ंक्शन में सभी फंसे त्रुटियों के लिए स्थानीय चरों को विशिष्ट रूप से नामित करने की आवश्यकता है?

उत्तर

9

जेएसलिंट, try..catch पर स्थानीय चर के रूप में e घोषित करने का निहित प्रभाव पड़ता है। चूंकि आपके पास एक ही फ़ंक्शन के भीतर दो ऐसे ब्लॉक हैं (जावास्क्रिप्ट में कोई ब्लॉक स्कोप नहीं है), जेएसलिंट देखता है कि एक वेरिएबल घोषित कर रहा है जिसे पहले से ही घोषित कर दिया गया है।

चर e1, e2, आदि JSLint से यह चेतावनी रोका जा सके नामकरण। क्या यह वास्तव में एक समस्या है? ईसीएमएस्क्रिप्ट 5 विनिर्देश, खंड 12.14 कहता है, "इससे कोई फर्क नहीं पड़ता कि कैसे नियंत्रण नियंत्रण को छोड़ देता है लेक्सिकल पर्यावरण हमेशा अपने पूर्व राज्य में बहाल किया जाता है।" यह, वास्तव में, मामला प्रतीत होता है:

try { 
    throw new Error("testing 1234"); 
} catch(fooBarBaz){ 
    alert("Catch: " + fooBarBaz); // works 
} 

alert(fooBarBaz); // throws exception 

तो, समाप्त करने के लिए, यह बस JSLint के सीमा है और किसी भी व्यावहारिक समस्या पैदा होने की संभावना नहीं है।

+0

ऐसा प्रतीत होता है कि आप सही हैं। मुझे लगता है कि कोशिश/पकड़ने के लिए _not_ पेश नहीं करता है, जैसा कि मैंने इस त्वरित परीक्षण द्वारा साबित किया है: http://jsfiddle.net/VRcwV/ –

+0

ओह बस संपादन को देखा! तो यह गुंजाइश पेश नहीं करता है, लेकिन पकड़ कथन द्वारा बनाए गए स्थानीय चर उस पकड़ के बाहर उपलब्ध नहीं है। तो यह केवल उस अपवाद के लिए विशेष दायरे का एक छोटा सा हिस्सा पेश करता है? –

+1

@ स्क्वीगी: आईई 8 * नहीं * अनुपालन है, ऐसा लगता है। उस ब्राउज़र में मेरा परीक्षण (http://jsfiddle.net/DpHMt/) आज़माएं, और आप * दोनों * अलर्ट बॉक्स खोलेंगे। – PleaseStand

0

JSLint I use कोई त्रुटि नहीं दिखाता है - और तार्किक आपका कोड सही है।

0

एक अलग चर का उपयोग करने का प्रयास करें, शायद यह भ्रमित हो रहा है क्योंकि ई आमतौर पर ईवेंट हैंडलर के लिए आरक्षित है।

+0

जहां तक ​​मुझे पता है कि 'ई' आरक्षित नहीं है। – pex

0

प्रत्येक प्रयास/पकड़ के लिए एक अलग चर का उपयोग करें।

0

जेएसलिंट बस यहां गलत हो सकता है। ECMAScript spec के अनुसार, catch ब्लॉक दर्ज करने से एक नया दायरा बन जाता है जिसके अंदर अपवाद चर परिभाषित किया जाता है। आपके उदाहरण में, e केवल catch ब्लॉक के अंदर मान्य है और इसे बाहर परिभाषित नहीं किया गया है। यहां कोई पुनर्वितरण नहीं है।

+1

ECMAScipt spec, निश्चित रूप से। लेकिन ब्राउज़र कार्यान्वयन, स्पष्ट रूप से नहीं: http://jsfiddle.net/VRcwV/ –

+0

@ स्क्वीगी: यह केवल अपवाद चर 'ई' है जो नए दायरे में जाता है। 'Var' के साथ घोषित वैरिएबल हमेशा कार्यक्षेत्र पर होते हैं। 'अलर्ट (ई)' आज़माएं और आप देखेंगे कि यह 'कैच' ब्लॉक के बाहर अपरिभाषित है। – casablanca

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