सवाल जावास्क्रिप्ट में, फ़ंक्शन () {} () से अधिक (फ़ंक्शन () {}) () का लाभ क्या है? [डुप्लिकेट]


संभावित डुप्लिकेट:
समारोह से पहले विस्मयादिबोधक चिह्न क्या करता है? 

मैंने लंबे समय से स्वयं निष्पादन के लिए निम्नलिखित प्रयोग किया है, जावास्क्रिप्ट में अज्ञात कार्य:

(function () { /* magic happens */ })()

हाल ही में, मैंने निम्नलिखित पैटर्न के अधिक उदाहरण देखना शुरू कर दिया है (उदाहरण के लिए, में बूटस्ट्रैप):

!function () { /* presumably the same magic happens */ }()

किसी को पता है कि दूसरा पैटर्न का लाभ क्या है? या, क्या यह सिर्फ एक स्टाइलिस्ट वरीयता है?


76
2017-09-28 17:02


मूल


इस पोस्ट को देखें कि यह दोनों के बीच का अंतर बताता है: stackoverflow.com/questions/3755606/... - Clive
विशेष रूप से यह जवाब stackoverflow.com/questions/3755606/... - Michael Jasper
मैं यह जवाब कहूंगा: stackoverflow.com/questions/3755606/... - Ivar Bonsaksen
वे इस उद्देश्य के लिए हैं (एक समारोह के मूल्यांकन को मजबूर करना अभिव्यक्ति संदर्भ, इसे तुरंत अपने वापसी मूल्य को अनदेखा कर कहा जाता है) समकक्ष, लेकिन आईएमएचओ I महसूस कि का उपयोग कर ग्रुपिंग ऑपरेटर (कोष्ठक) अधिक है "अर्थात् सही" (और शायद अधिक आम और पठनीय भी), क्योंकि यह है उद्देश्य इस ऑपरेटर का, अभिव्यक्ति का मूल्यांकन करें ... बस मेरे दो सेंट ... चीयर्स! - CMS
मुझे लगता है कि यह दुखी है कि यह एक डुप्लिकेट के रूप में बंद हो गया - यह प्रश्न और उसके सभी उत्तर डुप्लिकेट में किसी भी चीज़ से कहीं बेहतर हैं। - Skilldrick


जवाब:


इन दो अलग-अलग तकनीकों में एक कार्यात्मक है अंतर साथ ही उपस्थिति में एक अंतर। दूसरे पर एक तकनीक के संभावित फायदे इन मतभेदों के कारण होंगे।

संक्षिप्ति

जावास्क्रिप्ट एक भाषा है जहां संक्षिप्ति बहुत महत्वपूर्ण हो सकता है, क्योंकि जावास्क्रिप्ट है पृष्ठ लोड होने पर डाउनलोड किया गया। इसका मतलब है कि जावास्क्रिप्ट जितना संक्षिप्त होगा, तेजी से डाउनलोड समय। इस कारण से, जावास्क्रिप्ट हैं minifiers तथा ऑबफस्केटर जो डाउनलोड समय को अनुकूलित करने के लिए जावास्क्रिप्ट फ़ाइलों को संपीड़ित करता है। उदाहरण के लिए, में रिक्त स्थान alert ( "Hi" ) ; अनुकूलित किया जाएगा alert("Hi");

इसे ध्यान में रखते हुए, इन दो पैटर्न की तुलना करें

यह सबसे अच्छा माइक्रो-ऑप्टिमाइज़ेशन है, इसलिए जब तक आप ऐसा नहीं कर रहे हैं, तो मुझे यह विशेष रूप से आकर्षक तर्क नहीं मिलता है कोड गोल्फ प्रतियोगिता।

लौटा मूल्य नकारात्मक

के परिणाम मूल्य की तुलना करें a तथा b

var a = (function(){})()
var b = !function(){}()

के बाद से a समारोह कुछ भी वापस नहीं करता है, a होगा undefined। की अस्वीकृति के बाद से undefined है true, b का मूल्यांकन करेंगे true। यह उन लोगों के लिए एक लाभ है जो या तो फ़ंक्शन के लौटे हुए मूल्य को अस्वीकार करना चाहते हैं या सबकुछ-वापसी-एक-गैर-शून्य-या-अपरिभाषित-मूल्य बुत है। आप इस बारे में एक स्पष्टीकरण देख सकते हैं कि यह इस पर कैसे काम करता है अन्य ढेर ओवरफ्लो प्रश्न।

मुझे आशा है कि इससे आपको इस समारोह की घोषणा के पीछे तर्क को समझने में मदद मिलेगी जिसे आम तौर पर माना जाएगा विरोधी पैटर्न


78
2017-09-28 17:11



यदि इरादा केवल फ़ंक्शन निष्पादित करने के लिए है (जिसे मैं इसका उपयोग करता हूं), फिर वापस लौटना undefined वास्तव में मेरे लिए और अधिक सही लगता है। - Andrew Hedges
@AndrewHedges मैं सहमत होगा। - Peter Olson
मैंने आपको एक उपवास दिया, लेकिन मुझे 'संक्षिप्त' के साथ कुछ परेशानी है ... - kennebec
जावास्क्रिप्ट स्रोत कोड संक्षिप्त बनाने की कोशिश कर सिर्फ भ्रम के लिए एक नुस्खा की तरह लगता है। यह यथासंभव स्पष्ट होना चाहिए - इस प्रश्न का अस्तित्व यह स्पष्ट करता है कि जेएस कोड में स्पष्टता की एक बड़ी आवश्यकता है! इसे निर्माण प्रक्रिया के हिस्से के रूप में संदर्भित मिनीफ़ीयर में से एक के माध्यम से पारित किया जा सकता है। - intuited
@intuited दाएं। जैसा कि मैंने कहा, यह शायद एक बेकार माइक्रो-अनुकूलन है। उस ने कहा, मिनीफायर ऐसा नहीं करेंगे क्योंकि यह फ़ंक्शन के व्यवहार को बदलता है और कोड को तोड़ने का कारण बन सकता है। - Peter Olson


मैं हमेशा वापस गिरता हूँ बेन आलमैन आईआईएफई टुकड़ा इस तरह के सवालों के लिए। जहां तक ​​मेरा संबंध है, यह निश्चित है।

यहाँ मांस है लेख:

// Either of the following two patterns can be used to immediately invoke
// a function expression, utilizing the function's execution context to
// create "privacy."

(function(){ /* code */ }()); // Crockford recommends this one
(function(){ /* code */ })(); // But this one works just as well

// Because the point of the parens or coercing operators is to disambiguate
// between function expressions and function declarations, they can be
// omitted when the parser already expects an expression (but please see the
// "important note" below).

var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();

// If you don't care about the return value, or the possibility of making
// your code slightly harder to read, you can save a byte by just prefixing
// the function with a unary operator.

!function(){ /* code */ }();
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// Here's another variation, from @kuvos - I'm not sure of the performance
// implications, if any, of using the `new` keyword, but it works.
// http://twitter.com/kuvos/status/18209252090847232

new function(){ /* code */ }
new function(){ /* code */ }() // Only need parens if passing arguments

51
2017-09-28 17:19



अरे वाह। मैंने उसे नहीं देखा था। धन्यवाद! - Andrew Hedges
उह, जावास्क्रिप्ट एक गड़बड़ है। - BlueRaja - Danny Pflughoeft
जेएस एक गड़बड़ नहीं है, यह वास्तव में काफी शक्तिशाली है - इसमें अंक पर कुछ कम से कम वाक्यविन्यास है। ;) - Brian Arnold Sinclair
याद रखने के लिए सभी अतिरिक्त वाक्यविन्यास के साथ (हाँ, सच, ....do ... झूठी..no, झूठी, बंद), मैं तर्क दूंगा कि कॉफीस्क्रिप्ट जावास्क्रिप्ट को अधिक जटिल है। हालांकि कॉफीस्क्रिप्ट में कम वर्ण हैं, लेकिन यह आसान नहीं है। gist.github.com/1248911 - William
यह 1 बाइट बचाता है लेकिन मुझे लगता है कि यह एक सौंदर्य वस्तु भी हो सकती है। मुझे नहीं लगता ! सुंदर है लेकिन मुझे लगता है कि यह घोंसला से कम बदसूरत है ((){}()) संरचना ... - Chris Burt-Brown


ऐसा लगता है कि मुख्य बात यह है कि आप मूल रूप से फ़ंक्शन को कार्य घोषणा के रूप में फ़ंक्शन को समझने से रोक रहे हैं, और इसके बजाय इसे अज्ञात फ़ंक्शन अभिव्यक्ति के रूप में व्याख्या किया जा रहा है।

अभिव्यक्ति को समूहित करने या उपयोग करने के लिए माता-पिता का उपयोग करना! वापसी को अस्वीकार करने के लिए दोनों पार्सिंग को बदलने की तकनीकें हैं। इसके बाद तुरंत निम्नलिखित माता-पिता द्वारा आह्वान किया जाता है। इनमें से किसी भी और सभी रूपों का उस पर शुद्ध प्रभाव पड़ रहा है, कोई स्पष्ट वापसी मूल्य नहीं मानते हैं:

(function(){ /* ... */ })(); // Arguably most common form, => undefined
(function(){ /* ... */ }()); // Crockford-approved version, => undefined
!function(){ /* ... */ }();  // Negates the return, so => true
+function(){ /* ... */ }();  // Attempts numeric conversion of undefined, => NaN
~function(){ /* ... */ }();  // Bitwise NOT, => -1

यदि आप लौटे हुए मूल्य को कैप्चर नहीं कर रहे हैं, तो कोई महत्वपूर्ण अंतर नहीं है। कोई तर्क दे सकता है कि ~ एक तेज़ सेशन हो सकता है क्योंकि यह सिर्फ बिट्स फिसल रहा है, या शायद! एक तेज़ सेशन है क्योंकि यह सच / झूठी जांच है और अस्वीकृति वापस कर रहा है।

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

बेन आलमैन विषय पर एक शानदार लेखन है: http://benalman.com/news/2010/11/immediately-invoked-function-expression/


14
2017-09-28 17:21





पहला "पैटर्न" अज्ञात फ़ंक्शन को कॉल करता है (और इसके वापसी मूल्य का परिणाम होता है) जबकि दूसरा अनाम कार्य करता है और इसके परिणाम को अस्वीकार करता है।

क्या आप यही पूछ रहे हैं? वे करते हैं नहीं वहीं काम करें।


4
2017-09-28 17:07





यह है लगभग इस तथ्य को छोड़कर, केवल स्टाइलिस्ट वरीयता ! फ़ंक्शन रिटर्न प्रदान करता है (यानी रिटर्न true, जो से आता है !undefined)।

इसके अलावा, यह एक कम चरित्र है।


4
2017-09-28 17:10





ठीक है आप पहले मामले में उपयोग कर रहे हैं ( ) उस ऑब्जेक्ट को लपेटने के लिए जिसे आप अगले सेट के साथ निष्पादित करना चाहते हैं (), और अगले मामले में आप ऑपरेटर का उपयोग कर रहे हैं जो एक तर्क (अस्वीकरण ऑपरेटर!) लेता है और आप इसे अपने तर्क (funcion) को स्पष्ट रूप से लपेट रहे हैं ( ) तो आप वास्तव में मिलता है !(function () { })(), फ़ंक्शन निष्पादित करें, और इसके परिणाम को नकार दें। यह भी काम कर सकता है -, +, ~ उसी सिद्धांत में क्योंकि उन सभी ऑपरेटरों ने एक तर्क लिया है।

!function () { /* presumably the same magic happens */ }()
-function () { /* presumably the same magic happens */ }()
+function () { /* presumably the same magic happens */ }()
~function () { /* presumably the same magic happens */ }()

तुमने ऐसा क्यों करना चाहोगे? मुझे लगता है कि यह एक व्यक्तिगत वरीयता है या यदि आपके पास बड़ा है। जेएस और 1 char प्रति अज्ञात फ़ंक्शन कॉल को सहेजना चाहते हैं ...: डी


1
2017-09-28 17:20