জাভাস্ক্রিপ্টে প্রতিটি ফাংশনের পরে আমি কেন সেমিকোলন ব্যবহার করব?


282

আমি দেখেছি বিভিন্ন বিকাশকারী জাভাস্ক্রিপ্টে ফাংশনগুলির পরে সেমিকোলনগুলি অন্তর্ভুক্ত করেছেন এবং কিছু কিছু নেই। কোনটি সেরা অনুশীলন?

function weLikeSemiColons(arg) {
   // bunch of code
};

অথবা

function unnecessary(arg) {
  // bunch of code
}

উত্তর:


424

ফাংশন ঘোষণার পরে সেমিকোলনগুলি প্রয়োজন হয় না

এর ব্যাকরণটি স্পেসিফিকেশনটিতেFunctionDeclaration এভাবে বর্ণিত :

function Identifier ( FormalParameterListopt ) { FunctionBody }

ব্যাকরণগতভাবে কোনও সেমিকোলন নেই, তবে ভাবতে পারেন কেন?

সেমিকোলন একে অপরের থেকে পৃথক পৃথক বিবৃতি দেয় , এবং FunctionDeclarationএকটি বিবৃতি নয়

FunctionDeclarationsকোড কার্যকর করার ক্ষেত্রে প্রবেশের আগে মূল্যায়ন করা হয়, উত্তোলন এই আচরণটি ব্যাখ্যা করতে ব্যবহৃত একটি সাধারণ শব্দ

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

তবে আপনি যেখানে যেখানে ব্যবহার করবেন সেমিকোলনগুলি সর্বদা সুপারিশ করা হয় FunctionExpressions, উদাহরণস্বরূপ:

var myFn = function () {
  //...
};

(function () {
  //...
})();

আপনি যদি উপরের উদাহরণের মধ্যে প্রথম কার্যকারিতার পরে সেমিকোলনটি বাদ দেন তবে আপনি সম্পূর্ণ অনাকাঙ্ক্ষিত ফলাফল পাবেন:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

প্রথম ফাংশনটি তাত্ক্ষণিকভাবে কার্যকর করা হবে, কারণ দ্বিতীয়টির চারপাশের প্রথম বন্ধনীগুলি, হিসাবে ব্যাখ্যা করা হবে Arguments একটি ফাংশন কল ।

প্রস্তাবিত বক্তৃতা:


2
পরিষ্কার করতে সম্পাদিত, এই নিবন্ধটি ফাংশন প্রকাশের
CMS

1
ইসিএমএর সাথে পুরোপুরি পরিচিত নয়, তবে এটি আমিও ব্যবহার করি standard ভাল পোস্ট। আমি অনলাইনে দেখি বেশিরভাগ টট এবং কোডের নমুনা আমি ডিএল ব্যবহার করি, তাই আমি এটির সাথে খাপ খাইয়ে নিয়েছি।
রেজেক্স

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

"নামযুক্ত ফাংশন এক্সপ্রেশনগুলি ডিমেস্টাইফড" লিঙ্কটি এখন একটি মৃত ইউআরএল-এর সাথে লিঙ্ক করেছে, ওয়েব সংরক্ষণাগারটির একটি অনুলিপি এখানে রয়েছে: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/…
টনি

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

38

আমি এগুলি ফাংশন-এ-ভেরিয়েবল ঘোষণার পরে ব্যবহার করি:

var f = function() { ... };

তবে শাস্ত্রীয় ধাঁচের সংজ্ঞা অনুসারে নয়:

function f() {
    ...
}

নেটবিয়ানস, পাশাপাশি অন্যান্য আইডিইগুলি এই ফাংশন-যেমন-ভেরিয়েবলের পরে আধা-কোলন দেখতে পছন্দ করে যেমন এই.animaton_fun = ফাংশন () {...};
ল্যান্স ক্লিভল্যান্ড

6
তবে - প্রশ্নকর্তার জন্য - কেন ?
লুক

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

20

জেএস লিন্ট ডি-ফ্যাক্টো কনভেনশন, এবং এটি ফাংশন বডি পরে কোনও সেমিকোলন বলে না। দেখুন "সেমিকোলন" অধ্যায়।


10
আমি প্রথম হাতে একটি ফাংশন প্রত্যক্ষ করেছি যা সেমিকোলনের অভাবে ব্যর্থ হয়েছিল। আমি পুরোপুরি একমত নই যে এটিকে ছেড়ে দেওয়া একটি সম্মেলন। যদিও ৯৯.৯৯% সময়টি এটি ভাঙবে না, এমন কিছু পরিস্থিতি রয়েছে যেখানে আমি লক্ষ্য করেছি যে সেমিকোলন ছাড়া জাভা স্ক্রিপ্টটি ইন্টারপেট করতে অক্ষম হয়েছে।
মিলসজ্রোস

8
আমার প্রতিক্রিয়া শুধুমাত্র ফাংশন সংজ্ঞা যেমন প্রশ্নের দুটি উদাহরণের সাথে কাজ করে। এইসব ক্ষেত্রে, একটি সসীম সেমিকোলন মধ্যে প্রয়োজন হয় না কোন ব্রাউজার, মধ্যে কোনো অবস্থা। আমার ধারণা আপনি হয়ত ফাংশন এক্সপ্রেশন নিয়ে ভাবছেন। এগুলি সম্পূর্ণ আলাদা বিষয়, এবং মূল প্রশ্নে সম্বোধন করা একটি নয়।
ডেভিড হেডলুন্ড 18

var myFunction = ফাংশন (আরগ) so কনসোল.লগ (আরগ); function (ফাংশন () {কনসোল.লগ ('সম্পূর্ণ সম্পর্কহীন ফাংশন'); ফিরে 'কী ঘটে দেখুন';} ());
ম্যাকিয়েজ ক্রাওকজিক

@ মিলসজ্রোস আমি ডেভিডের প্রতিক্রিয়া দ্বিতীয়টি, এবং আপনি যদি ব্যর্থতাটি পুরোপুরি উপস্থাপন করেন তবে আপনি খুশি হবেন। এটি আসলে কোনও ফাংশন এক্সপ্রেশন বা আইইয়ের বাগ ছিল?
wlnirvana

7

শুধু ধারাবাহিক থাকুন! তাদের প্রয়োজন হয় না, তবে আমি ব্যক্তিগতভাবে সেগুলি ব্যবহার করি কারণ বেশিরভাগ সংশোধন কৌশলগুলি আধা-কোলনের উপর নির্ভর করে (উদাহরণস্বরূপ, প্যাকার )।


5

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

যদিও আমি সাধারণত আধা কলোনগুলিতে ফাংশন ঘোষণা শেষ করি না তবে এটি কেবল আমার পছন্দ।

ব্রাউজারগুলি এটি যে কোনও উপায়ে চালাবে, তবে সম্ভবত কোনও দিন তারা এটিকে পরিচালনা করার জন্য আরও কঠোর মান নিয়ে হাজির হবে।

কোডের উদাহরণ আমি লিখব:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
লাইনগুলি অবশ্যই সেমিকোলন দিয়ে শেষ করা উচিত should অন্যথায় একটি মিনিফায়ার পুরোপুরি কার্যকারিতা ভঙ্গ করতে পারে
ডেভিড হেডলুন্ড

9
@ ডেভিড: সেক্ষেত্রে মিনিফায়ারটি ভেঙে গেছে, নিশ্চয়ই?
অসন্তুষ্ট গোট

একমত। এটি সি / সি ++ ব্যাকগ্রাউন্ড থেকে আগত লোকদের (আমার মতো) কোডিংয়ের একটি প্রাকৃতিক উপায়। এটি কোডটি আরও পঠনযোগ্য করে তোলে।
অঙ্কুশান ম্যানরাল

3

এটি আসলে কনভেনশন বা ধারাবাহিকতার ইস্যুর চেয়ে বেশি।

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

এছাড়াও, আপনি কোডটি সংক্ষেপিত বা সংক্ষিপ্তকরণ করার সময়, আধা-কোলনের অভাব আপনার স্ক্রিপ্টের একটি সংক্ষিপ্ত সংস্করণে নিয়ে যেতে পারে যা আপনি যা চান তা করেন না কারণ সমস্ত সাদা স্থান চলে যায়।


3
প্রশ্নটির দিকে লক্ষ্য করা হয়েছিল যে সেমিকোলনগুলি ফাংশনের পরে থাকতে হবে, প্রতিটি বিবৃতি নয়। আমি সম্মত হলাম যে প্রতিটি প্রতিবেদনের পরে আপনার অর্ধিকোলন স্থাপন করা উচিত এবং আমি অন্যান্য স্ট্যাকওভারফ্লো conক্যমত্যটি একই বলে দেখলাম।
ম্যাক্কা 1

1
সম্মত, এবং কার্যের পরে সেমিকোলন স্থাপনে ব্যর্থ হওয়ার ফলে আমি উল্লেখ করেছি সেই মিনিফিকেশন ইস্যুতে ফলস্বরূপ। শুভকামনা স্যার।
ম্যাসন

আপোভেট 'কমানোর বিষয়টি পুনর্বহাল করার কারণটি আমার বোঝার ব্যাখ্যা দিয়েছে
JackW327

1

আমি যখন আমার স্ক্রিপ্টগুলি মিনিমাইজ করেছিলাম তখন বুঝতে পারি যে সমান চিহ্ন দিয়ে শুরু হওয়া ফাংশনগুলির জন্য আমার সেমিকোলন ব্যবহার করা উচিত। যদি আপনি কোনও ফাংশনটি ভার হিসাবে সংজ্ঞায়িত করেন তবে হ্যাঁ আপনাকে সেমিকোলন ব্যবহার করা উচিত।

সেমিকোলন দরকার

var x = function(){};
var x = new function(){};
this.x = function(){};

সেমিকোলনের দরকার নেই

function x(){}

0

সহজ:

সেমিকোলন ত্যাগ করা ভাল অনুশীলন is ;ফাংশন ধনুর্বন্ধনী শেষ হওয়ার পরে । তারা বছরের পর বছর ধরে সেরা অনুশীলন হিসাবে বিবেচিত হয়।

এগুলি সর্বদা ব্যবহার করার একটি সুবিধা হ'ল যদি আপনি নিজের জাভাস্ক্রিপ্টটি ছোট করতে চান।

জাভাস্ক্রিপ্টকে সংশোধন করার সাথে সাথে ফাইলের আকারটি কিছুটা কমাতে সহায়তা করে।

তবে উপরের সেরা অনুশীলন এবং উত্তর হিসাবে, এটি কোনও ফাংশন ট্যাগের পরে ব্যবহার করার প্রস্তাব দেওয়া হয়নি।

আপনি যদি সেমিকোলন ব্যবহার না করেন এবং আপনি যদি সংশোধন করতে চান (যদি অনেক বিকাশকারী তাদের সাইটের মতো অনেকগুলি জাভাস্ক্রিপ্ট ব্যবহার করে তবে এটি করতে চান) আপনি সমস্ত ধরণের ত্রুটি / সতর্কতা পেতে পারেন।


0

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

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

এবং

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

যখন আপনি উভয়কে সংক্ষিপ্ত করবেন, আপনি নিম্নলিখিত আউটপুট হিসাবে পাবেন

মনে রাখবেন যে মন্তব্যগুলি কেবল ইলাস্ট্রেশনের জন্য

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

এবং

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.