घुंघराले ब्रेस प्लेसमेंट के आधार पर परिणाम भिन्न क्यों होते हैं?


119

नीचे दिए गए कोड स्निपेट, इस लेख से लिए गए, घुंघराले ब्रेसिज़ के स्थान में केवल एक परिवर्तन के कारण अलग-अलग परिणाम क्यों देते हैं ?

जब उद्घाटन कर्ली ब्रेस {एक नई लाइन पर होता है, तो test()रिटर्न undefined, और "नहीं - यह टूट गया: अपरिभाषित" अलर्ट में प्रदर्शित होता है।

function test()
{
  return
  { /* <--- curly brace on new line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}

जब ब्रेस समान लाइन पर होता है return, तो test()एक ऑब्जेक्ट देता है, और "शानदार" अलर्ट हो जाता है।

function test()
{
  return { /* <---- curly brace on same line */
    javascript: "fantastic"
  };
}

var r = test();
try {
  alert(r.javascript); // does this work...?
} catch (e) {
  alert('no - it broke: ' + typeof r);
}


अर्ध-सम्मिलन शब्दार्थ के बाद returnअन्य स्थानों की तुलना में थोड़ा अलग है, और उस जगह में "ब्रेक" का मतलब "मिडस्ट्रीम" की तुलना में "अधिक" है।
डंडविस

जवाबों:


165

यह जावास्क्रिप्ट के नुकसान में से एक है: स्वचालित अर्धविराम सम्मिलन। लाइनें जो अर्धविराम के साथ समाप्त नहीं होती हैं, लेकिन एक बयान का अंत हो सकता है, स्वचालित रूप से समाप्त हो जाती हैं, इसलिए आपका पहला उदाहरण इस तरह से प्रभावी रूप से दिखता है:

function test()
{
  return; // <- notice the inserted semicolon
  { 
    javascript: "fantastic"
  };
}

डगलस क्रॉफोर्ड की जेएस शैली गाइड भी देखें , जिसमें अर्धविराम सम्मिलन का उल्लेख है।

अपने दूसरे उदाहरण में आप एक वस्तु (घुंघराले ब्रेसिज़ द्वारा निर्मित) संपत्ति javascriptऔर उसके मूल्य के साथ वापस करते हैं "fantastic", प्रभावी रूप से इस तरह से:

function test() {
    var myObject = new Object();
    myObject.javascript = "fantastic";
    return myObject;
}

5
मजेदार तथ्य: कुछ इंजनों पर आप ऑटो-सम्मिलित अर्धविरामों पर टिप्पणी कर सकते हैं
क्रिस्टोफर तारकिनी

1
@ क्रिस: क्या? कौन सा? यह कहीं भी पता लगाया है?
सीन मैकमिलन

1
@SeanMcMillan मैंने निश्चित रूप से इसके बारे में लेख पढ़ा है, लेकिन मैं उनमें से किसी को भी त्वरित खोज से नहीं ढूंढ सकता। मुझे याद है कि डाल return /*और फिर */{ प्रभावी रूप से क्रोम के पुराने संस्करणों में छिपे हुए अर्ध-बृहदान्त्र को प्रभावी ढंग से टिप्पणी करेंगे। यकीन नहीं होता है कि अभी भी लागू होता है
क्रिस्टोफर टर्कीनी

2
इन विचित्रताओं के कारण मैंने 10 साल पहले खुद से एक वादा किया था: वेब से दूर रहें! मैंने प्रार्थना की कि इंटरव्यू फीका हो जाए ... दुर्भाग्य से यह योजना के अनुसार नहीं चला, और अब मुझे इन मुद्दों के साथ भी संघर्ष करना होगा। कर्म एब है * tch :)
जोवेन

1
मैंने ऐसे लोगों को देखा है जो धार्मिक रूप से जावास्क्रिप्ट में अर्धविराम के खिलाफ हैं, मैंने हमेशा सोचा है कि वे उस अतिरिक्त समय के साथ क्या करते हैं जो वे अर्धविराम नहीं लगाकर बचाते हैं।
ईमान मोहम्मदी

9

जावास्क्रिप्ट को बयानों के अंत में अर्धविराम की आवश्यकता नहीं है, लेकिन दोष यह है कि यह अनुमान लगाना होगा कि अर्धविराम कहाँ हैं। ज्यादातर समय यह कोई समस्या नहीं होती है, लेकिन कभी-कभी यह अर्धविराम पर हमला करता है जहां आपने एक इरादा नहीं किया था।

इस बारे में मेरे ब्लॉग पोस्ट का एक उदाहरण ( जावास्क्रिप्ट - लगभग रेखा आधारित नहीं ):

यदि आप इस तरह कोड प्रारूपित करते हैं:

function getAnswer() {
   var answer = 42;
   return
      answer;
}

फिर इसकी व्याख्या इस तरह की जाती है:

function getAnswer() {
  var answer = 42;
  return;
  answer;
}

रिटर्न स्टेटमेंट इसका पैरामीटर रहित रूप लेता है, और तर्क स्वयं का स्टेटमेंट बन जाता है।

आपके कोड के साथ भी ऐसा ही होता है। फ़ंक्शन की व्याख्या इस प्रकार की जाती है:

function test()
{
  return;
  {
    javascript : "fantastic"
  };
}

3

मैं व्यक्तिगत रूप से पठनीयता (बनाम के एंड आर शैली) के लिए ऑलमैन स्टाइल पसंद करता हूं।

के बजाय…

function test() {
  return {
    javascript : "fantastic"
  };
}

मुझे पसंद है…

function test() 
{
  var obj =
  {
    javascript : "fantastic"
  };

  return obj;
}

लेकिन यह एक काम है। मैं हालांकि इसके साथ रह सकता हूं।


3
मुझे लगता है कि हमें व्यक्तिगत प्राथमिकताओं से बचना चाहिए जो मुख्यधारा से विचलित करती हैं। हमें बहुमत के विकल्पों का पालन करना चाहिए, जो स्थिरता को बढ़ावा देता है, जिससे पठनीयता बढ़ेगी
Jowen

1
मुझे K & R की तुलना में उसका कोड अधिक पठनीय लगता है। जब आप "पठनीय" का अर्थ करते हैं तो बहुत व्यक्तिपरक है
ब्रैन

मैं ऑलमैन को भी पसंद करता हूं ... लेकिन एएसआई के कारण, जब मुझे किसी ऑब्जेक्ट को वापस करने की आवश्यकता होती है, तो मैं सेमी को वापसी के समान लाइन पर छोड़ देता हूं। मैं एक "var x =" लाइन जोड़ने के लिए इसे पसंद करता हूं ...
मिक

1

यह इसलिए है क्योंकि जावास्क्रिप्ट सबसे अधिक बार ";" प्रत्येक पंक्ति के अंत में, मूल रूप से जब आप एक ही पंक्ति में {लौटते हैं, तो जावास्क्रिप्ट इंजन यह देखता है कि कुछ और होगा, और जब नई लाइन में इसकी सोच आपको "लगाना भूल गया"; और आपके लिए रख देता है।


1
मुझे नहीं पता कि सिची, डारिन और इवो के उत्तरों को क्यों अस्वीकृत किया गया?
BoltClock

1

यहां घुंघराले ब्रेसिज़ एक नई वस्तु के निर्माण का संकेत देते हैं। इस प्रकार आपका कोड इसके बराबर है:

function test() {
  var a = { javascript : "fantastic" };
  return a;
}

जो लिखते समय काम करता है:

function test() {
  var a = { javascript : "fantastic" };
  return; // ; is automatically inserted 
      a;
}

यह अब काम नहीं करता है।


0

जैसा कि ऊपर वर्णित है समस्या वास्तव में अर्धविराम इंजेक्शन है। मैंने अभी इस विषय पर एक अच्छी ब्लॉग पोस्टिंग पढ़ी है। यह इस मुद्दे और जावास्क्रिप्ट के बारे में एक पूरी बहुत अधिक बताते हैं। इसमें कुछ अच्छे संदर्भ भी शामिल हैं। आप इसे यहाँ पढ़ सकते हैं


हाँ, मैंने यह भी पढ़ा है कि, मैं पढ़ने वाला यहाँ js के मास्टरमाइंड द्वारा बेहतर समझाने के लिए कहता हूँ।
जस्टलर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.