javascript - meaning - विस्मयादिबोधक वाक्य के उदाहरण




समारोह से पहले विस्मयादिबोधक चिह्न क्या करता है? (6)

IIFE लिखने का एक और तरीका (तुरंत-अभिव्यक्ति समारोह अभिव्यक्ति)।

लेखन का दूसरा तरीका -

(function( args ) {})()

के समान

!function ( args ) {}();
!function () {}();

उपयोग करने के लिए एक अच्छा मुद्दा है ! airbnb जावास्क्रिप्ट गाइड पर चिह्नित फ़ंक्शन आमंत्रण के लिए

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

!function abc(){}()
!function bca(){}();

के रूप में काम करेंगे

!function abc(){}()
;(function bca(){})();

लेकिन दो अक्षर बचाता है और मनमाने ढंग से बेहतर दिखता है।

और जिस तरह से + , - , ~ , void ऑपरेटरों का एक ही प्रभाव होता है, कार्यवाही समारोह के मामले में, निश्चित रूप से यदि आपने उस फ़ंक्शन से वापस आने के लिए कुछ उपयोग किया है तो वे अलग-अलग कार्य करेंगे।

abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?

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

!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()

सुरक्षित कोड निष्पादन करेगा, जैसा कि पहले कोड नमूना के समान होगा।

यह त्रुटि कारण फेंक देगा क्योंकि जावास्क्रिप्ट एएसआई अपना काम नहीं कर पाएगा।

!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()

यूनरी ऑपरेटरों के बारे में एक नोट, वे समान काम करेंगे, लेकिन केवल अगर वे पहले मॉड्यूल में नहीं थे। इसलिए यदि आपके पास कॉन्सटेनेशन ऑर्डर पर कुल नियंत्रण नहीं है तो वे इतने सुरक्षित नहीं हैं।

यह काम:

!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()

यह नहीं:

^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()

कार्यक्रम:

function () {}

कुछ भी नहीं देता (या अपरिभाषित)।

कभी-कभी हम इसे एक फ़ंक्शन को कॉल करना चाहते हैं जैसे हम इसे बनाते हैं। आप इसे आजमा सकते हैं:

function () {}()

लेकिन इसके परिणामस्वरूप SyntaxError

का उपयोग करना ! फ़ंक्शन से पहले ऑपरेटर इसे अभिव्यक्ति के रूप में माना जाता है, इसलिए हम इसे कॉल कर सकते हैं:

!function () {}()

यह फ़ंक्शन के रिटर्न वैल्यू के विपरीत बुलियन को भी वापस कर देगा, इस मामले में true , क्योंकि !undefined true । यदि आप कॉल का परिणाम होने के लिए वास्तविक वापसी मूल्य चाहते हैं, तो इसे इस तरह से करने का प्रयास करें:

(function () {})()

जावास्क्रिप्ट सिंटैक्स 101. यहां एक फ़ंक्शन घोषणा है :

function foo() {}

ध्यान दें कि कोई अर्धविराम नहीं है: यह केवल एक समारोह घोषणा है । वास्तव में फ़ंक्शन चलाने के लिए आपको एक आमंत्रण, foo() की आवश्यकता होगी।

अब, जब हम प्रतीत होता है कि निर्दोष विस्मयादिबोधक चिह्न !function foo() {} यह इसे अभिव्यक्ति में बदल देता है। यह अब एक समारोह अभिव्यक्ति है

! अकेले ही फ़ंक्शन का आह्वान नहीं करता है, लेकिन हम अब अंत में () को डाल सकते हैं !function foo() {}() जिसकी तुलना में अधिक प्राथमिकता है ! और तुरंत समारोह को बुलाता है।

तो लेखक क्या कर रहा है प्रति कार्य अभिव्यक्ति एक बाइट बचा रहा है; इसे लिखने का एक और अधिक पठनीय तरीका यह होगा:

(function(){})();

अंत में ! अभिव्यक्ति वापस सच बनाता है। ऐसा इसलिए है क्योंकि डिफ़ॉल्ट रूप से सभी आईआईएफई वापस undefined , जो हमें छोड़ देता है !undefined जो true । विशेष रूप से उपयोगी नहीं है।


! परिणामस्वरूप नतीजे (विपरीत) जो भी आप उम्मीद कर रहे हैं, यानी यदि आपके पास है

var boy = true;
undefined
boy
true
!boy
false

जब आप boy बुलाते हैं, तो आपका परिणाम true होगा, लेकिन जिस क्षण आप जोड़ते हैं ! boy बुलाते हुए, यानी !boy , आपका परिणाम false होगा। जो दूसरे शब्दों में आप नोबॉय का मतलब है, लेकिन इस बार यह मूल रूप से एक बुलियन परिणाम है, या तो true या false

यह वही बात है जो होता है !function () {}(); अभिव्यक्ति, केवल function () {}(); चलाना function () {}(); आपको एक त्रुटि ध्वजांकित करेगा, लेकिन जोड़ें ! आपके function () {}(); ठीक सामने function () {}(); अभिव्यक्ति, इसे function () {}(); के विपरीत बनाता है function () {}(); जो आपको true करना चाहिए। उदाहरण नीचे देखा जा सकता है:

function () {}();
SyntaxError: function statement requires a name
!function () {}();
true

! एक तार्किक नहीं ऑपरेटर है, यह एक बुलियन ऑपरेटर है जो इसके विपरीत कुछ उलटा कर देगा।

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

इसके बजाए, यदि आवश्यक हो तो बंद करने वाले कोष्ठक और बैंग ( ! ) का उपयोग करें।

// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.

(function(){ return false; }());
=> false

!(function(){ return false; }());
=> true

!!(function(){ return false; }());
=> false

!!!(function(){ return false; }());
=> true

अन्य ऑपरेटर जो काम करते हैं ...

+(function(){ return false; }());
=> 0

-(function(){ return false; }());
=> -0

~(function(){ return false; }());
=> -1

संयुक्त ऑपरेटर ...

+!(function(){ return false; }());
=> 1

-!(function(){ return false; }());
=> -1

!+(function(){ return false; }());
=> true

!-(function(){ return false; }());
=> true

~!(function(){ return false; }());
=> -2

~!!(function(){ return false; }());
=> -1

+~(function(){ return false; }());
+> -1




function