2015-10-31 15 views
8

के साथ एक स्थिर अंदर कोशिश/पकड़ को परिभाषित करें आज मैं एक अजीब जेएस बग में चलाता हूं, const के साथ एक कोशिश/पकड़ ब्लॉक के अंदर काम करता हूं, और मैं बेहतर समझना चाहता हूं कि इसका कारण क्या है।जावास्क्रिप्ट: सख्त मोड

try { 
    const FOO = 'bar'; 
    console.log('inside:', FOO); 
} catch (e) {} 
console.log('outside:', FOO); 

यह प्रवेश करेंगे:

inside: bar 
outside: bar 

हम करने के लिए "सख्त मोड" स्विच करते हैं, हालांकि:

एक कोड उदाहरण को

आइए नज़र, कि अधिक से अधिक एक हजार शब्दों के बराबर है

'use strict'; 
try { 
    const FOO = 'bar'; 
    console.log('inside:', FOO); 
} catch (e) {} 
console.log('outside:', FOO); 

अब एक ही कोड त्रुटि उत्पन्न करता है:

ReferenceError: FOO is not defined 

अगर हम बदलने हालांकि constvar साथ:

'use strict'; 
try { 
    var foo = 'bar'; 
    console.log('inside:', foo); 
} catch (e) {} 
console.log('outside:', foo); 

तो यह सब फिर से ठीक काम करता है, यहां तक ​​कि "सख्त मोड" में:

inside: bar 
outside: bar 

किसी को भी कृपया मुझे समझने में मदद कर सकते हैं क्यों const असाइनमेंट "सख्त मोड" में एक कोशिश/पकड़ ब्लॉक के अंदर काम नहीं कर रहा है?

धन्यवाद!

+0

'साथ let', नहीं' var' –

उत्तर

15

const, जैसा कि ईसीएमएस्क्रिप्ट 6 द्वारा परिभाषित किया गया है, block-level variable declaration है। आपको ReferenceError मिलता है क्योंकि यह try के बाहर दायरे में नहीं है। (और TDZ के बिना)

हालांकि, constsome engines लंबे ES6 से पहले, एक अपरिवर्तनीय समकक्ष के रूप में var को समारोह-स्तरीय दायरे व्यवहार के साथ पेश किया गया था,। यदि आप मैला मोड (जो आपको नहीं होना चाहिए) में हैं, तो भी आप इसे अपने ब्राउज़र के विरासत समर्थन के हिस्से के रूप में अनुभव कर सकते हैं।

+0

'const' की तुलना मैं विरासत के बारे में कोई जानकारी नहीं है" 'const'" था। एमडीएन फुटनोट: "फ़ायरफ़ॉक्स और क्रोम के पहले संस्करणों में और सफारी 5.1.7 और ओपेरा 12.00 के रूप में, यदि आप कॉन्स के साथ एक चर परिभाषित करते हैं, तो भी आप बाद में अपना मान बदल सकते हैं।" – joews

+0

@joews: हाँ, यह 'var' के लिए उपनाम से बेहतर कुछ भी नहीं था, ताकि एफएफ (मानक फीचर की धारणा में) के लिए लिखी गई स्क्रिप्ट कम से कम सफारी और ओपेरा में वाक्यविन्यास त्रुटियों के बिना चलें, भले ही गारंटी न हो unassignability। – Bergi

+1

"यह इस तरह काम करना जारी रखेगा" - क्रोम 48 (वर्तमान कैनरी) में वी 8 किसी भी मोड में ब्लॉक स्कोप लागू करता है (कंसोल/स्निपेट में परीक्षण किया गया; मुझे कोई संदर्भ नहीं मिल रहा है)। मुझे लगता है कि यह रिलीज से पहले बदल सकता है। – joews

4

आपकी जावास्क्रिप्ट रनटाइम का ES6 const का आंशिक कार्यान्वयन है।

ReferenceError अपना पहला उदाहरण के लिए अपेक्षित व्यवहार है, क्योंकि const is block scoped है और आप को परिभाषित करने try ब्लॉक के बाहर FOO एक्सेस करते हैं।

इंजन का उपयोग कर रहे const वाक्य रचना का समर्थन करता है, लेकिन यह केवल कठोर मोड में ब्लॉक scoping अर्थ विज्ञान लागू होता है।

वर्तमान स्थिर क्रोम (46) यह करता है। हालांकि, क्रोम 48, सख्त मोड के साथ या बिना ब्लॉक स्कोप लागू करता है।

var ब्लॉक स्कॉप्ड नहीं है, इसलिए आपका अंतिम उदाहरण अपेक्षा के अनुसार काम करता है।

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