জাভাস্ক্রিপ্টের স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ (এএসআই) এর জন্য নিয়ম কী?


445

ঠিক আছে, প্রথমে আমার জিজ্ঞাসা করা উচিত এটি ব্রাউজার নির্ভর কিনা।

আমি পড়েছি যে যদি একটি অবৈধ টোকেন পাওয়া যায় তবে কোডটির বিভাগটি সেই অবৈধ টোকেন অবধি বৈধ হয়, যদি একটি লাইন ব্রেকের আগে থাকে তবে সেমিকোলন টোকেনের আগে .োকানো হয়।

তবে সেমিকোলন সন্নিবেশজনিত বাগের জন্য উদ্ধৃত সাধারণ উদাহরণটি হ'ল:

return
  _a+b;

.. যা এই নিয়মটি অনুসরণ করে বলে মনে হচ্ছে না, যেহেতু _a একটি বৈধ টোকেন হবে।

অন্যদিকে, কল চেইনগুলি প্রত্যাশা অনুযায়ী কাজ করে:

$('#myButton')
  .click(function(){alert("Hello!")});

কারও কি নিয়মের আরও গভীর-বিবরণ রয়েছে?


22
সেখানে হয় একটি বৈশিষ্ট ...
মাইলস

33
@ মাইলগুলি কেবল আপনার ভাঙা লিঙ্কে নয় ;-) ecma-international.org/publications/standards/Ecma-262.htm
Zach Lysobey

3
দেখুন পি। উপরের 26 উদ্ধৃত পিডিএফ।
3


বিভাগ 11.9 স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ
অ্যান্ড্রু ল্যাম

উত্তর:


454

প্রথমে আপনার জানা থাকা উচিত যে কোন বিবৃতিগুলি স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ দ্বারা প্রভাবিত হয় (ব্রেভিটির জন্য এএসআই হিসাবে পরিচিত):

  • খালি বিবৃতি
  • var বিবৃতি
  • অভিব্যক্তি বিবৃতি
  • do-while বিবৃতি
  • continue বিবৃতি
  • break বিবৃতি
  • return বিবৃতি
  • throw বিবৃতি

এএসআই এর কংক্রিট নিয়মগুলি, স্পেসিফিকেশন -11.9.1 এ স্বয়ংক্রিয় সেমিকোলন সন্নিবেশের বিধিগুলিতে বর্ণিত হয়েছে

তিনটি ক্ষেত্রে বর্ণনা করা হয়েছে:

  1. যখন একটি টোকেন ( LineTerminatorবা }) মুখোমুখি হয় যা ব্যাকরণ দ্বারা অনুমোদিত নয়, সেমিকোলন এটির আগে sertedোকানো হয় যদি:

    • টোকনটি পূর্বের টোকেন থেকে কমপক্ষে একটি দ্বারা পৃথক করা হয় LineTerminator
    • টোকেনটি হ'ল }

    যেমন :

    { 1
    2 } 3

    রূপান্তরিত হয়

    { 1
    ;2 ;} 3;

    NumericLiteral 1প্রথম অবস্থা, নিম্নলিখিত টোকেনটি একটি লাইন টারমিনেটর হয় পূরণ করে। দ্বিতীয় অবস্থা, নিম্নোক্ত টোকেন পূরণ করে ।
    2}

  2. যখন টোকেনগুলির ইনপুট স্ট্রিমটির সমাপ্তি ঘটে এবং পার্সার একক সম্পূর্ণ প্রোগ্রাম হিসাবে ইনপুট টোকেন স্ট্রিমটিকে বিশ্লেষণ করতে অক্ষম হয়, তখন ইনপুট স্ট্রিমের শেষে একটি সেমিকোলন স্বয়ংক্রিয়ভাবে sertedোকানো হয়।

    যেমন :

    a = b
    ++c

    রূপান্তরিত হয়:

    a = b;
    ++c;
  3. এই কেসটি ঘটে যখন ব্যাকরণের কিছু উত্পাদন দ্বারা একটি টোকেনকে অনুমোদিত করা হয়, তবে উত্পাদনটি একটি সীমাবদ্ধ উত্পাদন , সীমাবদ্ধ টোকেনের আগে একটি সেমিকোলন স্বয়ংক্রিয়ভাবে প্রবেশ করা হয়।

    সীমাবদ্ধ প্রযোজনা:

    UpdateExpression :
        LeftHandSideExpression [no LineTerminator here] ++
        LeftHandSideExpression [no LineTerminator here] --
    
    ContinueStatement :
        continue ;
        continue [no LineTerminator here] LabelIdentifier ;
    
    BreakStatement :
        break ;
        break [no LineTerminator here] LabelIdentifier ;
    
    ReturnStatement :
        return ;
        return [no LineTerminator here] Expression ;
    
    ThrowStatement :
        throw [no LineTerminator here] Expression ; 
    
    ArrowFunction :
        ArrowParameters [no LineTerminator here] => ConciseBody
    
    YieldExpression :
        yield [no LineTerminator here] * AssignmentExpression
        yield [no LineTerminator here] AssignmentExpression

    ক্লাসিক উদাহরণ সহ ReturnStatement:

    return 
      "something";

    রূপান্তরিত হয়

    return;
      "something";

4
# 1: ব্যাকরণ দ্বারা অনুমোদিত টোকেনটি সাধারণত লাইন টার্মিনেটর হয় না, এটি কি (যদি আপনি # 3 থেকে সীমাবদ্ধ প্রযোজনাকে বোঝায় না)? মনে হয় আপনার প্রথম বন্ধনী বাদ দেওয়া উচিত। # 2 ++cস্পষ্টতার জন্য উদাহরণটি কেবল সন্নিবেশ প্রদর্শন করা উচিত নয় ?
বার্গি

2
দয়া করে নোট করুন এএসআইকে আসলে "সেমিকোলনগুলি সন্নিবেশ" করার দরকার নেই, কেবল কোনও ইঞ্জিনের পার্সারে বিবৃতিটি শেষ করতে ...
এপ্রিলিয়ন

1
এটি "ইনপুট স্ট্রিম" কী বলে, এর অর্থ কি "একটি রেখা"? "ইনপুট টোকেন স্ট্রিম" এটি বোঝার জন্য কিছুটা শক্ত করে
তুলছে

নির্দিষ্ট লিঙ্কটি অন্য কারও জন্য কাজ করে? এটি আমাকে প্রায় খালি পৃষ্ঠায় নিয়ে গেছে যার একটি মৃত লিঙ্ক ছিল।
ইটক্রিটর

দয়া করে ব্যাখ্যা করুন কীভাবে, এই নিয়ম অনুসারে, নীচে "a [লাইন ব্রেক] = [লাইন ব্রেক] 3" এর below 者 無極 而 by দ্বারা নিচের উদাহরণটি এখনও কাজ করে
নির ও।

45

ECMA-262 থেকে সরাসরি , পঞ্চম সংস্করণ ECMAScript নির্দিষ্টকরণ :

7.9.1 স্বয়ংক্রিয় সেমিকোলন সন্নিবেশনের বিধি

সেমিকোলন সন্নিবেশের তিনটি মূল নিয়ম রয়েছে:

  1. প্রোগ্রামটি যখন বাম থেকে ডানে পার্স করা হয়, তখন একটি টোকেন (যাকে অফেন্ডিং টোকেন বলা হয় ) এর মুখোমুখি হয় যা ব্যাকরণের কোনও উত্পাদন দ্বারা অনুমোদিত নয়, তারপরে নিম্নোক্তগুলির এক বা একাধিক যদি আপত্তিজনক টোকেনের আগে একটি সেমিকোলন স্বয়ংক্রিয়ভাবে inোকানো হয় শর্ত সত্য:
    • আপত্তিজনক টোকেনটি কমপক্ষে একটি দ্বারা পূর্ববর্তী টোকেন থেকে পৃথক করা হয় LineTerminator
    • আপত্তিজনক টোকেন হয় }
  2. যখন প্রোগ্রামটি বাম থেকে ডানে পার্স করা হয়, টোকেনগুলির ইনপুট স্ট্রিমের শেষটি উপস্থিত হয় এবং পার্সার একক সম্পূর্ণ ECMAScript হিসাবে ইনপুট টোকেন স্ট্রিমটি পার্স করতে অক্ষম হয় Program, তারপরে একটি সেমিকোলন স্বয়ংক্রিয়ভাবে শেষের শেষে sertedোকানো হয় ইনপুট স্ট্রিম.
  3. প্রোগ্রামটি বাম থেকে ডানে পার্স করার সময়, একটি টোকেনের মুখোমুখি হয় যা ব্যাকরণের কিছু উত্পাদনের দ্বারা অনুমোদিত হয়, তবে উত্পাদনটি একটি সীমাবদ্ধ উত্পাদন এবং টোকেনটি টার্মিনাল বা নন-টার্মিনালের প্রথম টোকেন হিসাবে টীকাগুলির সাথে সাথে অনুসরণ করে " [ LineTerminatorএখানে নেই] " সীমাবদ্ধ উত্পাদনের মধ্যে (এবং সেইজন্য এ জাতীয় টোকেনকে একটি সীমাবদ্ধ টোকেন বলা হয়), এবং সীমাবদ্ধ টোকেনটি কমপক্ষে একটি লাইন টার্মিনেটর দ্বারা পূর্ববর্তী টোকেন থেকে পৃথক করা হয় , তারপরে একটি অর্ধিকোলন স্বয়ংক্রিয়ভাবে সীমাবদ্ধ টোকেনের আগে sertedোকানো হয়।

তবে পূর্ববর্তী নিয়মগুলির জন্য একটি অতিরিক্ত ওভাররাইডিং শর্ত রয়েছে: সেমিকোলনটি স্বয়ংক্রিয়ভাবে কখনই প্রবেশ করা হয় না যদি সেমিকোলনটি খালি বিবৃতি হিসাবে বিশ্লেষণ করা হয় বা যদি সেমিকোলনটি forবিবৃতি শিরোনামের দুটি অর্ধকোলনের একটি হয়ে যায় (দেখুন 12.6 দেখুন) .3)।


44

আমি চশমাগুলিতে এই 3 টি নিয়ম খুব ভাল করে বুঝতে পারি না - আরও স্পষ্ট ইংরেজী এমন কিছু পাওয়ার আশা করি - তবে আমি জাভাস্ক্রিপ্ট থেকে যা সংগ্রহ করেছি তা হল: সংজ্ঞায়িত গাইড, 6th ষ্ঠ সংস্করণ, ডেভিড ফ্লানাগান, ওরিলি, ২০১১:

উদ্ধৃতি:

জাভাস্ক্রিপ্ট প্রতিটি লাইন বিরতিটিকে সেমিকোলন হিসাবে বিবেচনা করে না: এটি সাধারণত লাইন বিরতিগুলি সেমিকোলন হিসাবে বিবেচনা করে তবেই যদি সেমিকোলনগুলি ছাড়াই কোডটি বিশ্লেষণ করতে না পারে।

আর একটি উদ্ধৃতি: কোডের জন্য

var a
a
=
3 console.log(a)

জাভাস্ক্রিপ্ট দ্বিতীয় লাইনের বিরতিটিকে সেমিকোলন হিসাবে বিবেচনা করে না কারণ এটি দীর্ঘ বিবৃতি a = 3 পার্স করা অবিরত রাখতে পারে;

এবং:

সাধারণ নিয়মের দুটি ব্যতিক্রম যে জাভাস্ক্রিপ্ট প্রথম লাইনে বিবৃতিটির ধারাবাহিকতা হিসাবে দ্বিতীয় রেখাকে বিশ্লেষণ করতে না পারলে সেমিকোলন হিসাবে বিভাজনকে ব্যাখ্যা করে। প্রথম ব্যতিক্রম রিটার্ন, বিরতি, এবং বিবৃতি অবিরত জড়িত

... যদি এই শব্দের পরে কোনও লাইন বিরতি উপস্থিত হয় ... জাভাস্ক্রিপ্ট সর্বদা সেই লাইন বিরতিটিকে সেমিকোলন হিসাবে ব্যাখ্যা করবে।

... দ্বিতীয় ব্যতিক্রম ++ এবং −− অপারেটরগুলির সাথে জড়িত ... আপনি যদি এই অপারেটরগুলির কোনওটিকে পোস্টফিক্স অপারেটর হিসাবে ব্যবহার করতে চান তবে তাদের অবশ্যই প্রয়োগ হওয়া অভিব্যক্তির মতো একই লাইনে উপস্থিত থাকতে হবে। অন্যথায়, লাইন বিরতিটি একটি সেমিকোলন হিসাবে গণ্য হবে, এবং ++ বা - এর পরে কোডটি প্রয়োগ করা প্রিফিক্স অপারেটর হিসাবে বিভক্ত হবে। এই কোডটি বিবেচনা করুন, উদাহরণস্বরূপ:

x 
++ 
y

এটি যেমন পার্স করা হয় x; ++y;, তেমন নয়x++; y

সুতরাং আমি এটিকে সহজ করার জন্য ভাবি, এর অর্থ:

সাধারণভাবে, জাভাস্ক্রিপ্ট যতদিন এটা জ্ঞান করে তোলে যেমন কোডের ধারাবাহিকতা যেমন বিবেচনা করবে - 2 মামলা ব্যতীত: (1) কিছু কিওয়ার্ড পছন্দ পর return, break, continue, এবং (2) যদি এটা দেখে ++বা --একটি নতুন লাইন, তাহলে এটি যোগ করা হবে ;পূর্ববর্তী লাইনের শেষে।

"কোড যতক্ষণ তা বোঝায় ততক্ষণ এটি ধারাবাহিকতা হিসাবে বিবেচনা করে" সম্পর্কে অংশটি এটিকে নিয়মিত প্রকাশের লোভী মিলের মতো অনুভব করে।

উপরের সাথে বলা হয়েছে, এর অর্থ returnএকটি লাইন ব্রেক সহ, জাভাস্ক্রিপ্ট ইন্টারপ্রেটার একটি sertোকাবে;

(আবার উদ্ধৃত: যদি এই শব্দের পরে কোনও লাইন বিরতি উপস্থিত হয় [যেমন return] ... জাভাস্ক্রিপ্ট সর্বদা সেই লাইন বিরতিটিকে সেমিকোলন হিসাবে ব্যাখ্যা করবে)

এবং এই কারণে, এর সর্বোত্তম উদাহরণ

return
{ 
  foo: 1
}

প্রত্যাশা মতো কাজ করবে না, কারণ জাভাস্ক্রিপ্ট দোভাষী এটি হিসাবে বিবেচনা করবেন:

return;   // returning nothing
{
  foo: 1
}

এর পরপরই কোনও লাইন-ব্রেক থাকতে হবে না return:

return { 
  foo: 1
}

এটি সঠিকভাবে কাজ করার জন্য। আপনি ;যদি ;কোনও বিবৃতি দেওয়ার পরে একটি ব্যবহারের নিয়মটি অনুসরণ করেন তবে আপনি নিজেকে সন্নিবেশ করতে পারেন :

return { 
  foo: 1
};

17

সেমিকোলন সন্নিবেশ এবং ভ্যার স্টেটমেন্ট সম্পর্কিত, ভার ব্যবহার করার সময় কমাটি ভুলে গিয়ে একাধিক লাইন বিস্তৃত রাখুন। গতকাল আমার কোডটিতে কেউ এটি পেয়েছে:

    var srcRecords = src.records
        srcIds = [];

এটি দৌড়েছিল তবে এর প্রভাবটি ছিল যে এসসিআরআইডিএস ঘোষণা / অ্যাসাইনমেন্টটি বৈশ্বিক ছিল কারণ পূর্ববর্তী লাইনে বর্ণ সহ স্থানীয় ঘোষণাপত্রটি আর প্রয়োগ করা হয়নি কারণ স্বয়ংক্রিয় অর্ধ-কোলন সন্নিবেশের কারণে বিবৃতিটি সমাপ্ত হিসাবে বিবেচিত হয়েছিল।


4
এই ধরণের জিনিসটি কেন আমি jsLint ব্যবহার করি
Zach Lysobey

1
তাত্ক্ষণিক প্রতিক্রিয়া সহ আপনার কোড সম্পাদকে জেএসহিন্ট / লিন্ট :)
dmi3y

5
@ বালুপটন যখন কমাটি লাইনটি শেষ করে দিয়েছিল তা ভুলে গেলে একটি আধা-কোলন স্বয়ংক্রিয়ভাবে sertedোকানো হয়। কোনও নিয়মের বিপরীতে এটি আরও একটি "গোটচা" এর মতো ছিল।
ডিজাইনিং

1
আমি মনে করি বালুপটন সঠিক, আপনি যদি লিখেন তবে এটি একটি পার্থক্য: var srcRecords = src.records srcIds = [];এক লাইনে এবং কমাটি ভুলে যান বা আপনি "রিটার্ন অ্যান্ড অ্যান্ড বি" লিখেন এবং কিছুই ভুলে যান না ... তবে আয়র আগে লাইন ব্রেকটি একটি স্বয়ংক্রিয় সেমিকোলন returnোকানোর পরে ফিরে আসে, যা এএসআই বিধি দ্বারা সংজ্ঞায়িত করা হয় ...
সেবাস্তিয়ান

3
আমি মনে করি প্রতিটি লাইনে টাইপ করার স্পষ্টতা var( let, const) টাইপ করতে লাগে এমন এক সেকেন্ডের ভগ্নাংশের চেয়ে বেশি।
স্কোয়াডে

5

জাভাস্ক্রিপ্টের অটোমেটিক সেমিকোলন সন্নিবেশের সর্বাধিক প্রাসঙ্গিক বিবরণটি ক্র্যাফটিং ইন্টারপ্রেটারদের সম্পর্কে একটি বই থেকে এসেছে ।

জাভাস্ক্রিপ্টের "স্বয়ংক্রিয় সেমিকোলন সন্নিবেশ" বিধিটি বিজোড়। যেখানে অন্যান্য ভাষাগুলি মনে করেন যে সর্বাধিক নতুনরেখাগুলি অর্থবহ এবং কয়েকটি মাত্রিক বিবৃতিতে কেবল কয়েকটি উপেক্ষা করা উচিত, জেএস বিপরীতে ধরে নেয়। এটি আপনার সমস্ত নিউলাইনগুলি অর্থহীন শ্বেতস্পেস হিসাবে বিবেচনা করে যদি না এটি পার্স ত্রুটির সম্মুখীন হয়। যদি এটি হয় তবে তা পিছনে গিয়ে ব্যাকরণগতভাবে বৈধ কিছু পাওয়ার জন্য আগের নিউলাইনটিকে একটি সেমিকোলনে পরিণত করার চেষ্টা করে।

তিনি গন্ধের কোড হিসাবে এটি বর্ণনা করতে চলেছেন ।

আমি কীভাবে এটি কীভাবে কাজ করে সে সম্পর্কে সম্পূর্ণ বিশদ বিবরণে গেলে এই ডিজাইন নোটটি একটি ডিজাইনের ডায়িটারেবে পরিণত হবে, এটি একটি খারাপ ধারণা less এটি একটি জগাখিচুড়ি. জাভাস্ক্রিপ্ট একমাত্র ভাষা আমি জানি যেখানে অনেক স্টাইল গাইড প্রতিটি বিবৃতি দেওয়ার পরে স্পষ্টত অর্ধেকোলনগুলির দাবি করে যদিও ভাষা তাত্ত্বিকভাবে আপনাকে সেগুলি বদ্ধ করতে দেয়।


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