Node.js/JavaScript कंसोल में इस मूल्यांकन के पीछे कोई स्पष्टीकरण:

> a:1
1

परिवर्तनीय फेंकता त्रुटि को असाइन करने का प्रयास कर रहा है:

> x = a:1
Thrown:
x = a:1
     ^

SyntaxError: Unexpected token :

जे एस कंसोल में केवल a: छोड़ने के रूप में करता है:

a:
VM138:3 Uncaught SyntaxError: Unexpected token }(…)

Node.js REPL में रहते हुए:

> a:
... 3
3
1
Dmitri Zaitsev 28 अगस्त 2019, 08:58

1 उत्तर

सबसे बढ़िया उत्तर

जब a की शुरुआत को कथन की शुरुआत के रूप में पार्स किया जाता है, तो इसे लेबल के रूप में व्याख्यायित किया जाता है (जो कुछ ऐसा है जिसे तोड़ने के लिए इस्तेमाल किया जा सकता है) स्थिर फंदा)।

outer:
for (let i = 0; i < 10; i++) {
  console.log('outer loop iteration');
  for (let j = 0; j < 10; j++) {
    if (i === 3) {
      break outer;
    }
  }
}

लेकिन, दुर्भाग्य से, लेबल की अनुमति तब भी दी जाती है, जब वे लूप से कनेक्टेड नहीं होते हैं, इसलिए ऐसा एक होने पर जहां यह कुछ भी नहीं करता है, सिंटैक्स त्रुटि नहीं फेंकता है। नतीजतन, लाइन

a:1

के रूप में व्याख्या की जाती है

a: // label named a
1  // unused expression

यदि a का प्रारंभ किसी कथन के प्रारंभ में नहीं है, तो इसे एक लेबल के रूप में पार्स नहीं किया जा सकता है, इसलिए कोलन केवल कुंजी-मान युग्म के भाग के रूप में समझ में आता है - इसलिए यदि जावास्क्रिप्ट टेक्स्ट को पार्स किया जा रहा है, तो यह किसी ऑब्जेक्ट लिटरल का हिस्सा नहीं है, यह एक सिंटैक्स त्रुटि को फेंक देगा, जैसा कि यह आपके x = a:1 कोड के साथ करता है।

कंसोल के लिए, लेबल का कोई मतलब नहीं है जब तक कि उनके बाद कोड न हो जो संभवतः लेबल का उपयोग कर सके। यदि आप कंसोल में कोड टाइप करते हैं, और उस कोड में शीर्ष स्तर पर एक लेबल शामिल है, तो उस लेबल को केवल तब तक परिभाषित किया जाएगा जब तक कि अभी-अभी दर्ज किया गया कोड चलता है। तो इस तरह के कोड में अंतिम पंक्ति के रूप में एक लेबल को परिभाषित करने के परिणामस्वरूप वह लेबल कभी भी पहुंच योग्य नहीं होगा, यही कारण है कि कंसोल त्रुटि फेंकता है (या, क्रोम 76 पर मेरे मामले में, कोड निष्पादित करने से इंकार कर देता है, और इसके बजाय बस मुझे देता है टाइप करना जारी रखने के लिए एक नई लाइन)।

5
CertainPerformance 28 अगस्त 2019, 09:12