2009-12-02 12 views
251

मैंने देखा है कि विभिन्न डेवलपर्स जावास्क्रिप्ट में कार्यों के बाद अर्धविराम शामिल हैं और कुछ नहीं हैं। सबसे अच्छा अभ्यास कौन सा है?जावास्क्रिप्ट में प्रत्येक फ़ंक्शन के बाद मुझे अर्धविराम का उपयोग क्यों करना चाहिए?

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

या

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

उत्तर

373

अर्धविराम आवश्यक नहीं हैं।

एक FunctionDeclaration के व्याकरण इस रूप में the specification में वर्णित है:

function Identifier (FormalParameterListopt) { FunctionBody } 

कोई अर्धविराम व्याकरण की दृष्टि से आवश्यक है, लेकिन क्यों आश्चर्य हो सकता है?

अर्धविराम एक दूसरे से बयान अलग की सेवा, और एक FunctionDeclaration एक बयान नहीं है।

FunctionDeclarations से पहले कोड निष्पादन में प्रवेश करता है मूल्यांकन किया जाता है, hoisting एक आम शब्द इस व्यवहार की व्याख्या करने के लिए प्रयोग किया जाता है।

"फ़ंक्शन घोषणा" और "फ़ंक्शन स्टेटमेंट" शब्द अक्सर गलत तरीके से उपयोग किए जाते हैं, क्योंकि ईसीएमएस्क्रिप्ट विशिष्टता में वर्णित कोई फ़ंक्शन स्टेटमेंट नहीं है, हालांकि कुछ कार्यान्वयन हैं जिनमें उनके व्याकरण में फ़ंक्शन स्टेटमेंट शामिल है, -निटे तौर पर मोज़िला - लेकिन फिर यह गैर मानक है।

हालांकि अर्धविराम हमेशा सलाह दी जाती है जहां FunctionExpressions उपयोग करते हैं, उदाहरण के लिए:

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

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

पूरी तरह से अवांछित परिणाम आप ऊपर के उदाहरण में पहले समारोह के बाद अर्धविराम छोड़ देते हैं, तो आप मिल जाएगा:

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

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

पहला फ़ंक्शन तुरंत निष्पादित किया जाएगा, क्योंकि दूसरे के आस-पास के कोष्ठक को फ़ंक्शन कॉल के Arguments के रूप में व्याख्या किया जाएगा।

अनुशंसित व्याख्यान:

+2

स्पष्ट करने के लिए संपादित, यह आलेख ** फ़ंक्शन एक्सप्रेशन ** – CMS

+1

ईसीएमए से पूरी तरह से परिचित नहीं है, लेकिन यह मानक भी मैं उपयोग करता हूं। अच्छी पोस्ट अधिकांश टट्स जिन्हें मैं ऑनलाइन देखता हूं और कोड नमूने मैं डीएल उस मानक का उपयोग करता हूं, इसलिए मैंने इसे अनुकूलित किया है। – regex

+1

यहां कुछ भ्रम "अनुमति के लिए एक अच्छा अंग्रेजी शब्द की कमी से प्रभावित हो सकता है क्योंकि इसे अनदेखा कर दिया जाएगा"। हम "वैकल्पिक" कहने पर वापस आते हैं, लेकिन यह भ्रामक है क्योंकि यह सुझाव देता है कि एक घोषणा के बाद अर्धविराम शामिल नहीं है जिसमें एक बयान के बाद अर्धविराम शामिल नहीं है। उत्तरार्द्ध एक पूरी तरह से अलग अर्थ में वैकल्पिक है: ऐसा इसलिए है क्योंकि पार्सर * आपके द्वारा छोड़े गए लापता अर्धविराम को जोड़ देगा *, जबकि इस मामले में, ऐसा इसलिए है क्योंकि पार्सर * आपके द्वारा शामिल अर्धविराम * को अनदेखा कर देगा। इसे एक और तरीका रखने के लिए: यदि कोई वैकल्पिक है, तो * आठ * हैं। – Semicolon

7

बस लगातार रहो! उनकी आवश्यकता नहीं है, लेकिन मैं व्यक्तिगत रूप से उनका उपयोग करता हूं क्योंकि अधिकांश खनन तकनीक सेमी-कोलन पर निर्भर करती हैं (उदाहरण के लिए, Packer)।

4

वास्तव में आपकी वरीयता पर निर्भर करता है। मुझे सेमी कॉलन के साथ कोड की रेखाएं समाप्त करना पसंद है क्योंकि मुझे जावा, सी ++, सी #, आदि में उपयोग किया जाता है, इसलिए मैं जावास्क्रिप्ट में कोडिंग के लिए समान मानकों का उपयोग करता हूं।

हालांकि मैं आमतौर पर सेमी कॉलन में फ़ंक्शन घोषणाओं को समाप्त नहीं करता हूं, लेकिन यह मेरी प्राथमिकता है।

ब्राउज़र इसे किसी भी तरह से चलाएंगे, लेकिन शायद कुछ दिन वे इसे नियंत्रित करने वाले कुछ कठोर मानकों के साथ आएंगे। कोड की

उदाहरण मैं लिखने होगा:

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

लाइनों को निश्चित रूप से सेमीकॉलन के साथ समाप्त कर दिया जाना चाहिए, था। अन्यथा एक मिनीफायर कार्यक्षमता पूरी तरह से तोड़ सकता है –

+8

@ डेविड: उस मामले में minifier टूट गया है, निश्चित रूप से? – DisgruntledGoat

20

JS Lint जिस वास्तविक सम्मेलन है, और यह समारोह शरीर के बाद कोई अर्धविराम कहते हैं। "सेमीकॉलन" अनुभाग देखें। समारोह घोषणाओं के बाद

+9

मैंने पहली बार एक ऐसा फ़ंक्शन देखा है जो अर्धविराम की कमी के कारण विफल रहा है। मैं पूरी तरह असहमत हूं कि इसे छोड़कर एक सम्मेलन है। जबकि 99.99% समय टूट जाएगा, कुछ ऐसी स्थितियां हैं जहां मैंने देखा है कि आईई अर्धविराम के बिना जावास्क्रिप्ट को इंटरसेट करने में असमर्थ रहा है। – MillsJROSS

+7

मेरी प्रतिक्रिया केवल कार्य परिभाषाओं से संबंधित है जैसे कि प्रश्न के दो उदाहरणों में। इन मामलों में, किसी भी * स्थिति में * किसी भी * ब्राउज़र में एक अर्धविराम अर्धविराम की आवश्यकता नहीं है। मुझे लगता है कि आप कार्य अभिव्यक्तियों के बारे में सोच रहे होंगे। वे एक पूरी तरह से अलग मामला हैं, और मूल प्रश्न में संबोधित नहीं किया गया था। –

+0

var myFunction = function (arg) {console.log (arg); } (फ़ंक्शन() { console.log ('पूरी तरह से असंबंधित फ़ंक्शन'); वापसी 'देखें क्या होता है'; }()); –

32

मैं समारोह के रूप में चर घोषणाओं के बाद उन्हें इस्तेमाल:

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

लेकिन बाद नहीं शास्त्रीय शैली परिभाषाएँ:

function f() { 
    ... 
} 
+0

नेटबीन, साथ ही साथ अन्य आईडीई जैसे फंक्शन-ए-वेरिएबल के बाद सेमी-कोलन देखना पसंद करते हैं जैसे इस .animaton_fun = function() {...}; –

+5

लेकिन - प्रश्नकर्ता के लिए - * क्यों *? – Luke

+0

यह बिल्ड चरण के दौरान मदद करता है। जब एक यूग्लिफायर स्क्रिप्ट अर्धविराम को देखती है, तो आउटपुट फ़ाइल में लाइन ब्रेक जोड़ने की आवश्यकता नहीं होती है, अगर ऐसा नहीं होता है, तो लाइन ब्रेक उत्पन्न होगा और फ़ाइल थोड़ी बड़ी होगी। – autoboxer

3

यह वास्तव में सम्मेलन या स्थिरता का एक मुद्दा से भी अधिक है।

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

इसके अलावा, जब आप कोड को संपीड़ित या छोटा कर रहे हैं, तो अर्ध-कॉलन की कमी से आपकी स्क्रिप्ट का एक छोटा संस्करण हो सकता है जो आप जो चाहते थे वह नहीं करता है क्योंकि सभी सफेद स्थान दूर हो जाते हैं।

+3

सवाल यह था कि अर्धविरामों को कार्यों के बाद होना चाहिए, हर कथन नहीं। मैं मानता हूं कि आपको प्रत्येक कथन के बाद अर्धविराम रखना चाहिए, और मैंने इसे अन्य स्टैक ओवरफ्लो सर्वसम्मति को देखा है। – macca1

+1

सहमत हुए, और कार्यों के बाद अर्धविराम लगाने में नाकाम रहने के परिणामस्वरूप मैंने उल्लेख किया कि खनन समस्या का उल्लेख किया जाएगा। शुभकामनाएं महोदय – Mason

+0

अपवोट 'कारण को कम करने के मुद्दे को मजबूत करने के कारण मेरी समझ स्पष्ट – JackW327

1

जब मैं अपनी स्क्रिप्ट को छोटा करता हूं तो मुझे एहसास हुआ कि फ़ंक्शन बराबर चिह्न के साथ शुरू होता है, मुझे अर्धविराम का उपयोग करने की आवश्यकता होती है। यदि आप एक समारोह को var के रूप में परिभाषित करते हैं, तो आपको अर्धविराम का उपयोग करने की आवश्यकता है।

अर्धविराम

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

कोई जरूरत अर्धविराम की जरूरत

function x(){} 
0

सरल:

यह समारोह ब्रेसिज़ के अंत के बाद अर्धविराम ; छोड़ने के लिए एक अच्छा अभ्यास है। उन्हें वर्षों के लिए सबसे अच्छा अभ्यास माना जाता है।

हमेशा उनका उपयोग करने का एक बड़ा लाभ यह है कि यदि आप अपनी जावास्क्रिप्ट को छोटा करना चाहते हैं।

जावास्क्रिप्ट को कम करने के रूप में, फ़ाइल आकार को कम करने में मदद करता है।

यदि आप अर्धविराम का उपयोग नहीं करते हैं, और यदि आप कम करना चाहते हैं (जैसे कई डेवलपर्स ऐसा करना चाहते हैं यदि उनकी साइट बहुत सारी जावास्क्रिप्ट परोसती है) तो आप सभी प्रकार की त्रुटियों/चेतावनियां प्राप्त कर सकते हैं।

संबंधित मुद्दे