दिलचस्प पोस्ट
एक चुटकी का पता लगाने के लिए सबसे सरल तरीका स्प्रिंग जेपीए विशिष्ट कॉलम का चयन करना सर्वोलेट कई समवर्ती ब्राउज़र अनुरोध को सिंक्रोनस रूप से प्रबंधित करता है कैसे डिफ़ॉल्ट अजगर संस्करण को बदलने के लिए? invalid_grant Google से oAuth टोकन प्राप्त करने का प्रयास कर रहा है MySQL दिनांक / समय मान को System.DateTime में परिवर्तित करने में असमर्थ पी के साथ डेटाबेस से गतिशील छवि प्रदर्शित करें: ग्राफिक इमेज और स्ट्रीमेड कंटेंट स्विफ्ट यादृच्छिक फ्लोट 0 और 1 के बीच फ़ाइल स्थान से जावा में .exe फ़ाइल चलाएं लाखों पंक्तियों के लिए जावास्क्रिप्ट डेटा ग्रिड एंड्रॉइड में मैं एक बिंदीदार / धराशायी रेखा कैसे बना सकता हूं? फ़ायरफ़ॉक्स और ओपेरा में वेबफॉन्ट स्मुटिंग और एंटिलायज़िंग A2DP प्रोफ़ाइल के लिए एक रिसीवर के रूप में Android डिवाइस जावास्क्रिप्ट का उपयोग करते हुए चयनित पाठ का सीएसएस बदलें यूनिटी में साधारण इवेंट सिस्टम

जावास्क्रिप्ट फ़ंक्शन प्रमुख बैंग! वाक्य – विन्यास

मैं अब कुछ पुस्तकालयों पर इस वाक्यविन्यास को देख रहा हूं और मैं सोच रहा हूं कि लाभ क्या है (ध्यान दें मैं क्लोजर के बारे में अच्छी तरह जानता हूं और कोड क्या कर रहा है, मैं सिर्फ सिंटैक्टीकल अंतर के बारे में चिंतित हूं)

!function(){ // do stuff }(); 

अधिक सामान्य के लिए एक विकल्प के रूप में

 (function(){ // do stuff })(); 

स्वयं के लिए अनाम कार्यों का आह्वान करने के लिए

मैं कुछ चीजें सोच रहा हूँ सबसे पहले, क्या वास्तव में काम करने के लिए शीर्ष उदाहरण की अनुमति है? इस कथन को वाक्यात्मक रूप से सही बनाने के लिए आवश्यक बैंग क्यों है? मुझे यह भी बताया गया है कि + काम करता है, और मुझे यकीन है कि कुछ अन्य लोगों की जगह !

दूसरा, लाभ क्या है? मैं यह बता सकता हूं कि यह एक एकल चरित्र को बचाता है, लेकिन मैं कल्पना नहीं कर सकता कि कई अपनाने वाले लोगों को आकर्षित करने के लिए इतने बड़े लाभ हैं क्या कुछ अन्य लाभ है जो मैं लापता हूं?

मैं देख सकता हूँ कि एकमात्र अंतर फर्क स्वयं के लिए मूल्य का होगा, लेकिन इन दोनों उदाहरणों में, हमें फ़ंक्शन के रिटर्न वैल्यू के बारे में वास्तव में परवाह नहीं है क्योंकि इसका उपयोग केवल एक क्लॉज बनाने के लिए किया जाता है। तो कोई मुझे बता सकता है कि कोई पहली सिंटैक्स का उपयोग क्यों कर सकता है?

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट फ़ंक्शन प्रमुख बैंग! वाक्य – विन्यास"

आदर्श रूप से आपको यह सब करने में सक्षम होना चाहिए:

 function(){ // do stuff }(); 

इसका अर्थ है गुमनाम समारोह घोषित करना और उसे निष्पादित करना। लेकिन यह जेएस व्याकरण की विशेषताओं के कारण काम नहीं करेगा।

तो इसे प्राप्त करने का सबसे छोटा रूप कुछ अभिव्यक्ति जैसे कि यूनारी एक्सपे्रेशन (और इसलिए कॉलएक्सेशन) का उपयोग करना है:

 !function(){ // do stuff }(); 

या मस्ती के लिए:

 -function(){ // do stuff }(); 

या:

 +function(){ // do stuff }(); 

या और भी:

 ~function(){ // do stuff return 0; }( ); 

जावास्क्रिप्ट में, function साथ शुरुआत की जाने वाली एक पंक्ति एक फ़ंक्शन कथन होने की उम्मीद है और उसे दिखना चाहिए

 function doSomething() { } 

जैसे स्वयं आत्मसात करने वाला समारोह

 function(){ // do stuff }(); 

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

 (function(){ // do stuff })(); 

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

मुझे इस सम्मेलन के बारे में पता नहीं था, लेकिन अगर यह सामान्य हो जाता है तो यह पठनीयता में योगदान दे सकता है। मेरा क्या मतलब यह है कि किसी को पढ़ने वाले किसी भी व्यक्ति के कोड के बड़े हिस्से के शीर्ष पर एक आत्म-अभिविन्यास की अपेक्षा की जाती है, जिस तरह से हम पहले से ही उम्मीद कर रहे हैं, जब हम देखते हैं कि हम (function करते हैं (function सिवाय इसके कि हम उन कष्टप्रद कोष्ठकों को खो देंगे । मुझे उम्मीद है कि इसका कारण, गति या चरित्र की गिनती में किसी भी बचत के विपरीत

उन चीजों के अलावा जो पहले ही कह चुके थे, साथ वाक्यविन्यास! उपयोगी है यदि आप जावास्क्रिप्ट बिना अर्धविराम लिखते हैं:

 var i = 1 !function(){ console.log('ham') }() i = 2 (function(){ console.log('cheese') })() 

पहला उदाहरण अपेक्षाकृत 'हैम' का उत्पादन करता है, लेकिन दूसरा एक त्रुटि फेंकता है क्योंकि i = 2 कथन निम्नलिखित कोष्ठक के कारण समाप्त नहीं किया गया है।

साथ ही जुड़ी जावास्क्रिप्ट फाइलों में आपको चिंता करने की ज़रूरत नहीं है अगर पूर्ववर्ती कोड में अर्धविराम लग गया है। तो आम के लिए कोई ज़रूरत नहीं है; (फ़ंक्शन () {}) (); यह सुनिश्चित करने के लिए कि आपका स्वयं टूट नहीं जाएगा

मुझे पता है कि मेरा उत्तर देर से है लेकिन मुझे लगता है कि इसका उल्लेख अभी तक नहीं किया गया है 🙂

एक बात के लिए, jsPerf दिखाता है कि का उपयोग कर ! (UnaryExpression's) आमतौर पर तेज़ होते हैं कभी-कभी वे समान होने के लिए बाहर आते हैं, लेकिन जब वे नहीं होते हैं, तो मैंने अभी तक दूसरों के ऊपर गैर-टकराया हुआ विजय नहीं देखा है: http://jsperf.com/bang-function

यह नवीनतम उबंटू पर सबसे पुराना (प्रति कह .. ..) क्रोम, संस्करण 8 के साथ परीक्षण किया गया था। तो परिणाम बिल्कुल भिन्न हो सकते हैं।

संपादित करें: कैसे delete चाहते हैं जैसे कुछ पागल?

 delete function() { alert("Hi!"); }(); 

या void ?

 void function() { alert("Hi!"); }(); 

जैसा कि आप यहां देख सकते हैं, जावास्क्रिप्ट में स्व-चालित विधियों का सर्वोत्तम तरीका उपयोग कर रहा है:

 (function(){}()); -> 76,827,475 ops/sec !function(){}(); -> 69,699,155 ops/sec (function(){})(); -> 69,564,370 ops/sec 

तो, नकार के साथ "!" और +, -, ~, हटाने, शून्य, जैसे बहुत सारे अन्य यूनिअरी ऑपरेटरों को संक्षेप में बताया गया है:

 !function(){ alert("Hi!"); }(); 

या

 void function(){ alert("Hi!"); }(); 

या

 delete function(){ alert("Hi!"); }(); 

और मज़ा के लिए द्विआधारी ऑपरेटरों के साथ कुछ और मामले 🙂

 1 > function() { alert("Hi!"); }(); 

या

 1 * function() { alert("Hi!"); }(); 

या

 1 >>> function() { alert("Hi!"); }(); 

या और भी

 1 == function() { alert("Hi!"); }(); 

किसी और लोगों के लिए टर्नरी छोड़ना 🙂