কোঁকড়া ধনুর্বন্ধনী প্লেসমেন্টের উপর ভিত্তি করে ফলাফলগুলি কেন পৃথক হয়?


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
@ সিয়ানম্যাকমিলান আমি অবশ্যই এ সম্পর্কে নিবন্ধগুলি পড়েছি তবে দ্রুত অনুসন্ধান থেকে আমি এর কোনওটি খুঁজে পাচ্ছি না। আমি মনে রাখবেন যে নির্বাণ return /*এবং তারপর */{ কার্যকরভাবে Chrome- এর পুরোনো সংস্করণগুলি লুকানো সেমিকোলন মন্তব্য করবে। এটি এখনও প্রয়োগ হয় কিনা তা নিশ্চিত নয়
ক্রিস্টোফার তারকুইনি

2
এই বিভ্রান্তির কারণে আমি নিজেকে 10 বছর আগে একটি প্রতিশ্রুতি দিয়েছিলাম: ওয়েব থেকে দূরে থাকুন! আমি প্রার্থনা করেছিলাম যে ইন্টারভিউগুলি মরে যাবে ... দুর্ভাগ্যক্রমে এটি পরিকল্পনা মতো হয়নি, এবং এখন আমাকে এই বিষয়গুলি নিয়েও লড়াই করতে হবে।
কর্মটি

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
আমি মনে করি যে আমাদের মূল পছন্দ থেকে মুছে ফেলা ব্যক্তিগত পছন্দগুলি এড়ানো উচিত। আমাদের সংখ্যাগরিষ্ঠের পছন্দগুলি অনুসরণ করা উচিত, যা ধারাবাহিকতা প্রচার করে, যা পাঠযোগ্যতা বৃদ্ধি করবে
জোয়েন

1
আমি তার কোড কে & আর এর চেয়ে বেশি পঠনযোগ্য বলে মনে করি। যখন আপনি "পঠনযোগ্য" বলতে চান তখন অত্যন্ত
ব্রান

আমিও ওলমানকে বেশি পছন্দ করি ... তবে এএসআই-এর কারণে যখন আমাকে কোনও জিনিস ফেরত দেওয়ার দরকার হয়, আমি রিটার্নের মতো একই লাইনেও সেমিটি ছেড়ে যাই। আমি
এটিতে

1

এর কারণ জাভাস্ক্রিপ্ট বেশিরভাগ ক্ষেত্রে ";" প্রতিটি লাইনের শেষে, তাই মূলত আপনি যখন ফিরে আসেন same একই লাইনে, জাভাস্ক্রিপ্ট ইঞ্জিনটি আরও কিছু থাকবে বলে দেখবে এবং এর নতুন লাইনে যখন মনে হয় আপনি ";" রাখতে ভুলে গেছেন এবং এটি আপনার জন্য রাখে।


1
সিচি, ডারিন এবং ইভোর উত্তরগুলি কেন হ্রাস পেয়েছে তা আমি পাই না?
বোলটলক

1

এখানে কোঁকড়ানো ধনুর্বন্ধনীগুলি একটি নতুন অবজেক্টের নির্মাণকে নির্দেশ করে। সুতরাং আপনার কোড সমান:

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

আপনি যদি লিখেন তবে যা কাজ করে:

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

এটি আর কাজ করে না।


0

সমস্যাটি সত্যই উপরের বর্ণিত হিসাবে সেমিকোলন ইনজেকশন। আমি কেবল এই বিষয়ে একটি ভাল ব্লগ পোস্টিং পড়েছি। এটি জাভাস্ক্রিপ্ট সম্পর্কে এই সমস্যাটি এবং আরও অনেক কিছু ব্যাখ্যা করে। এটিতে কিছু ভাল রেফারেন্সও রয়েছে। আপনি এটি এখানে পড়তে পারেন


হ্যাঁ, আমি এটিও পড়েছি, অটার রিডিং আমি এখানে জেএসের মাস্টারমাইন্ড দ্বারা আরও ভালভাবে ব্যাখ্যা করতে বলি।
JustLearn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.