फ़ंक्शन अभिव्यक्ति के सामने जावास्क्रिप्ट प्लस साइन


866

मैं तुरंत लागू किए गए कार्यों के बारे में जानकारी ढूंढ रहा हूं, और कहीं न कहीं मैं इस अंकन पर अड़ गया हूं:

+function(){console.log("Something.")}()

क्या कोई मुझे समझा सकता +है कि फ़ंक्शन के सामने संकेत का क्या अर्थ है / करता है?


17
बेन अल्मन यह सब यहाँ बताते हैं: mths.be/iife
Mathias Bynens

जवाबों:


1320

यह पार्सर को +अभिव्यक्ति के रूप में निम्नलिखित भाग का इलाज करने के लिए मजबूर करता है । यह आमतौर पर उन कार्यों के लिए उपयोग किया जाता है जिन्हें तुरंत लागू किया जाता है, जैसे:

+function() { console.log("Foo!"); }();

+वहाँ के बिना , अगर पार्सर एक ऐसी स्थिति में है जहाँ वह एक बयान की उम्मीद कर रहा है (जो एक अभिव्यक्ति या कई गैर-अभिव्यक्ति कथन हो सकता है), शब्द एक फ़ंक्शन अभिव्यक्ति की बजाय functionफ़ंक्शन घोषणा की शुरुआत की तरह दिखता है और इसलिए निम्न (ऊपर की पंक्ति के अंत में) एक वाक्यविन्यास त्रुटि होगी (जैसा कि उदाहरण में एक नाम की अनुपस्थिति होगी)। साथ , यह एक समारोह अभिव्यक्ति करता है, जिसका अर्थ है नाम वैकल्पिक है और जो समारोह है, जो लागू किया जा सकता है के लिए एक संदर्भ में परिणाम है, तो कोष्ठक मान्य हैं।()+

+विकल्पों में से एक है। यह भी हो सकता है -, !, ~, या किसी भी अन्य एकल ऑपरेटर के बारे में। वैकल्पिक रूप से, आप कोष्ठक का उपयोग कर सकते हैं (यह अधिक सामान्य है, लेकिन न तो अधिक और न ही कम सही रूप से सही है):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());

12
अधिक विस्तार यहाँ है, benalman.com/news/2010/11/…
कुंदन सिंह चौहान

159
क्या हम यह नहीं कह सकते कि पराग-लपेट एक श्रेष्ठ संकेतन है? मैं भावों को शामिल करने के लिए सेवारत के साथ बहुत परिचित हूं। यह बिल्कुल स्पष्ट नहीं है कि इस मामले में क्या कर रहा है यदि आप पहले से ही इस आर्कन क्विक ऑफ जेएस को नहीं जानते हैं।
क्रिस

1
नोट: दो parens विकल्पों में से, jsLint दूसरे को पसंद करता है। मुझे लगता है कि jsHint कम उधम मचाता है।
चुकंदर-चुकंदर

43
"प्लस" अंकन का उपयोग करने वाले आमतौर पर उपयोग किए जाने वाले पुस्तकालयों में से एक बूटस्ट्रैप है (जो कि मैंने इस धागे को पढ़ना समाप्त कर दिया है)।
विले

बूटस्ट्रैप ऐसा कर रहा है, btw: maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel

94

@ TJCrowder के उत्तर के लिए सहायक, +आमतौर पर मूल्य के संख्यात्मक कास्टिंग को बाध्य करने के लिए उपयोग किया जाता है क्योंकि यह SO उत्तर बताता है । इस उदाहरण में इसे 'यूनीरी प्लस ऑपरेटर' (गॉगलिंग में आसानी के लिए) कहा जाता है।

var num = +variant;

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

blah + (+(function(){ var scope; return "4"; })());

3
यह 37 उत्थान कैसे हुआ? (+function() { ... })()संकेतन (तथ्य से अलग है कि इस सवाल का जवाब नहीं है) त्रुटियों के बिना निष्पादित कभी नहीं कर सकते हैं।
श्वेतार्क

6
@whitequark: फ़ंक्शन + कॉल के आसपास ब्रेसिज़ की एक जोड़ी को याद किया। नंबर कास्टिंग के स्पष्टीकरण के कारण अपवोट अधिक थे।
फिल एच।

10
ठीक है, मैं नाइटपैकिंग हो सकता था।
व्हाइटवार्क

2
@Christoph मैं उन कोष्ठकों को वहाँ छोड़ने के लिए इच्छुक हूँ। वास्तव में, मैं उन्हें गायब करने के लिए उन्हें जोड़ने के लिए इतनी दूर जाऊंगा। यह बहुत अधिक स्पष्ट करता है कि क्या चल रहा है, और उन मुद्दों को भी रोकता है जब रिक्त स्थान को हटाकर कोड को कम किया जाता है, जिसके लिए अग्रणी 3++function...समान नहीं है।
बेंजाम

3
हालांकि आगे के प्रतिबिंब पर, यह +function...अपने आप में अनावश्यक है। वही परिणाम हो सकता है blah + function( ){ ... }( );जिसके साथ रैपिंग ब्रैकेट की आवश्यकता को नकारना होगा।
बेंजाम

60

तो संक्षिप्त उत्तर यह है कि यह एक तरह से या किसी अन्य में फ़ंक्शन परिणाम का उपयोग करके एक वाक्यविन्यास त्रुटि को रोकता है।

आप उस इंजन को भी निर्देश दे सकते हैं जिसे आप voidऑपरेटर का उपयोग करके रिटर्न वैल्यू में दिलचस्पी नहीं ले रहे हैं :

void function() { console.log("Foo!"); }();

बेशक, पूरी चीज़ के चारों ओर ब्रेस लगाना भी उस उद्देश्य को पूरा करता है।


45
शून्य या कोष्ठक अत्यधिक पसंद किए जाते हैं। वे डब्ल्यूटीएफ मुक्त हैं। + का उपयोग करना बहुत ही स्मार्ट नहीं है।
पीटर वॉन

2
एक अच्छा बिंदु। ऐसा लगता है कि ऑपरेटरों में से एक का उपयोग करके वर्तमान में उद्योग मानक के खिलाफ कदम होगा। शायद "शांत बच्चा" डेवलपर्स इसके लिए विकल्प चुनते हैं, अन्यथा मैं अभी भी शून्य या () के बजाय कुछ का उपयोग करने का एक बिंदु नहीं देख रहा हूं
dudewad
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.