2012-01-25 19 views
6

संभव डुप्लिकेट के बीच का अंतर है:
!function(){ }() vs (function(){ })()क्या समारोह() {}() और समारोह() {}()

तो मैं बस के स्रोत के माध्यम से पढ़ रहा था ट्विटर से नया बूटस्ट्रैप (2.0) और ध्यान दिया कि स्वयं-आमंत्रण अज्ञात फ़ंक्शन से पहले विस्मयादिबोधक चिह्न है। जब मैंने इसे देखा तो मैंने तुरंत सोचा "ओह बकवास, ऐसा करने का एक नया, बेहतर तरीका है?"।

अपने लिए देखें!

फिर भी, क्या फर्क है? इसके लिए एक कारण होना चाहिए क्योंकि वे लगातार अपने सभी जावास्क्रिप्ट प्लगइन (बूटस्ट्रैप के लिए) में इसका उपयोग करते हैं।

मैंने देखा एक और चीज इसके बाद "सख्त उपयोग" थी। मुझे नहीं लगता कि यह मेरी पिछली पूछताछ से संबंधित है, लेकिन क्या कोई इसे समझा सकता है?

धन्यवाद!

उत्तर

14
function(){}(); 

ही तक (प्वाइंट की टिप्पणी देखें), मान्य होने के लिए नहीं जा रहा है के बाद से

function() {} 

एक समारोह घोषणा है। इसे तुरंत लागू करने के लिए, आपको जावास्क्रिप्ट इंजन को अभिव्यक्ति के रूप में फ़ंक्शन का इलाज करने की आवश्यकता है। लोग आमतौर पर

!function(){}(); 

बस एक ही बात का एक आशुलिपि संस्करण होने के साथ

(function(){})(); //more common 

(function(){}()); // Papa Crockford's preference: 

दोनों में से किसी के रूप में यह करते हैं।

+2

+1। आप आग पर हैं! – gdoron

+0

+1 हालांकि बाद में इसकी आवश्यकता नहीं है लेकिन डौलस क्रैकफ़ोर्ड को एक अच्छा अभ्यास है :) – Sarfraz

+0

@gdoron - और अब मैं कैप्ड हूं। बेहतर काम पर वापस आएं :) –

8

आप 2 स्क्रिप्ट है, तो:

script1.js:

(function(){ 

})() 

script2.js:

(function(){ 

})() 

और आप उन्हें जोड़, आपको मिलता है:

(function(){ 

})() 
(function(){ 

})() 

यह एक त्रुटि का कारण बनता है, जबकि:

!function(){ 

}() 
!function(){ 

}() 

नहीं।

+0

+1 यह जानना अच्छा है। – Sarfraz

+0

यह भी कारण है कि कुछ स्क्रिप्ट प्रारंभ में अर्धविराम का उपयोग करती हैं: '; (फ़ंक्शन() {}())' – hugomg

+1

तो, क्या यह सुरक्षित कहकर '; (function() {}())' और ' समारोह() {}() 'एक ही उद्देश्य की सेवा करते हैं? – Johnny

3

ECMAScript Language Specification, खंड 12.4, का कहना है:

एक ExpressionStatementfunction कीवर्ड के साथ प्रारंभ नहीं कर सकता क्योंकि वह यह एक FunctionDeclaration के साथ अस्पष्ट बना सकता है।

तो यदि आप एक अज्ञात फ़ंक्शन निष्पादित करने वाले अभिव्यक्ति कथन चाहते हैं, तो आपको इस प्रतिबंध के आसपास काम करना होगा। ! जोड़ना (जो फ़ंक्शन के नतीजे को अस्वीकार करता है) यह दुभाषिया को स्पष्ट करता है कि यह एक अस्पष्टता नहीं है, यह अस्पष्टता से परहेज करता है।

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