2011-11-10 11 views
9

प्रश्न का शोध करते समय मैंने JSLint से एक दिलचस्प परिणाम देखा। जेएसलिंट ने शिकायत की कि एक चर परिभाषित करने से पहले उपयोग किया गया था।कोशिश/पकड़ अभिव्यक्तियों में var कीवर्ड: JSLint बग या वैश्विक असाइनमेंट?

(function() { 
    try { 
     var a = 0; 
     throw { name: "fakeError" }; 
    } catch (e) { 
     a = 1; 
    } 
}()); 

जावास्क्रिप्ट का मेरे समझ का कहना है कि इसके बाद के संस्करण कोड के बराबर होना चाहिए::

(function() { 
    var a; 
    try { 
     a = 0; 
     throw { name: "fakeError" }; 
    } catch (e) { 
     a = 1; 
    } 
}()); 

और वास्तव में, न तो उदाहरण a का कारण बनता है अस्तित्व के लिए यहाँ है कि एक ही परिणाम पैदा करता है कोड का एक छोटा संस्करण है फायरबग के माध्यम से चलाने पर वैश्विक दायरे में। मैंने ECMA-262 spec की धारा 12.14 पर एक नज़र डाली, लेकिन मुझे कुछ भी नहीं दिख रहा है जो मुझे लगता है कि कार्यों को अलग-अलग व्यवहार किया जाना चाहिए। क्या यह जेएसलिंट में बस एक बग है, या कुछ कार्यात्मक तरीके से दो अभिव्यक्ति अलग हैं?

उत्तर

5

यह सिर्फ एक बग है, लेकिन जेएसलिंट के डिफ़ॉल्ट विकल्प इसे पसंद करेंगे यदि आपने अपने सभी var स्टेटमेंट को शीर्ष पर ले जाया है।

1

जबकि घुंघराले ब्रेसिज़ {...} में कोड के कुछ ब्लॉक संलग्न केवल जावास्क्रिप्ट में एक नया गुंजाइश नहीं बना है, catch एक अपवाद के रूप ECMAScript 5 spec में उल्लेख किया है। कैच ब्लॉक के अंदर कोड कोड के बाहर की तुलना में एक अलग दायरा है। इसका कार्य आंतरिक दायरे की तरह व्यवहार किया जाता है।

दूसरे शब्दों में, के रूप में उल्लेख here:

कैच ब्लॉक कि जावास्क्रिप्ट में अद्वितीय है जब कैच ब्लॉक दर्ज किया गया है इस पहचानकर्ता बनाता है और यह वर्तमान क्षेत्र में जोड़ देता है; पहचानकर्ता केवल पकड़ ब्लॉक की अवधि के लिए रहता है; कैच ब्लॉक निष्पादित करने के बाद, पहचानकर्ता अब उपलब्ध नहीं है।

function f() { 
    try { 
    throw "foo"; 
    } catch (e) { 
    } 
    // e undefined here 
} 

और जैसा कि आप जानते हैं, एक जावास्क्रिप्ट में कोड के 2 अलग-अलग दायरों से चर उत्थापन उम्मीद नहीं कर सकते। तो, जेएसलिंट शिकायत करता है क्योंकि वह उसे जानता है।

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