2012-08-11 14 views
19

Possible Duplicate:
What does the exclamation mark do before the function?अज्ञात फ़ंक्शन कॉल पर ऑपरेटर का उपयोग क्यों नहीं करें? (एक ला नॉकआउट 2.1.0)

आप source code for KnockoutJS 2.1.0 को देखें, तो आप लाइन 7 पर इस शुरुआत की तरह एक कोड संरचना देखेंगे:

!function(factory) { ... }(factoryDefinition); 

नहीं ऑपरेटर के लिए मूल्यांकन करने के लिए इस अभिव्यक्ति का कारण बनता है trueundefined के बजाय, लेकिन परेशान क्यों?

+0

हां, ऐसा प्रतीत होता है कि मेरे पास "विस्मयादिबोधक चिह्न" प्रश्न जैसा ही प्रश्न है। माफ़ी, मैंने इसे अपनी खोज में नहीं देखा। – CgodLEY

+0

@CgodLEY: StackOverflow की खोज विराम चिह्न और अन्य प्रतीकों के साथ इतना अच्छा नहीं करती है। इसे जादू करने के लिए थोड़ा सा मदद करता है। –

+0

आप इसे अभिव्यक्ति की तरह दिखने और बयान के द्वारा फ़ंक्शन के तत्काल आमंत्रण को उत्तेजित करने के लिए उपयोग करते हैं। – dakt

उत्तर

38

यह तुरंत निष्पादित फ़ंक्शन अभिव्यक्ति बनाने का एक संक्षिप्त तरीका है।

परंपरागत रूप से, लोगों को इन दो रूपों

(function(){ }()); // Recommended by Crockford 
(function(){ })(); // What most people use 

क्योंकि यह बजाय एक की तुलना में एक समारोह घोषणा के रूप में व्याख्या की है आप, बस

function(){ }(); // Syntax error 

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

लेकिन यदि आप फ़ंक्शन घोषणा से पहले एक यूनरी ऑपरेटर डालते हैं, तो आपको कोज़िंग कोष्ठक जोड़ने की आवश्यकता नहीं है, और यह कोड के एक वर्ण को बंद कर देता है, जो एक (बहुत) छोटा प्रदर्शन लाभ है। ऐसे कई उद्देश्य ऑपरेटर हैं जिनका उपयोग इस उद्देश्य के लिए किया जा सकता है

!function(){ }(); 
~function(){ }(); 
-function(){ }(); 
+function(){ }(); 
3

क्योंकि आप कुछ तो यह एक सिंटैक्स त्रुटि की तरह दिखता है ऐसा नहीं करते हैं, तो:

function(factory) { ... }(factoryDefinition); 

यह कोशिश करो।

पार्सर को उस बिंदु पर प्राप्त करना आवश्यक है जहां यह अभिव्यक्ति की अपेक्षा करता है, ताकि function कीवर्ड उस संदर्भ में पहचाना जा सके। अन्यथा, जब पार्सर function को किसी कथन में पहले टोकन के रूप में देखता है, तो यह एक साधारण फ़ंक्शन घोषणा की अपेक्षा करता है, और उसके बाद किसी समेकित तर्क सूची का पालन नहीं किया जा सकता है।

विभिन्न विकल्पों में से प्रत्येक के चारों ओर विभिन्न विकल्प हैं।

+0

मैंने नोडजेएस पर निम्नलिखित अभिव्यक्ति की कोशिश की और यह ठीक लग रहा था, क्या मुझे कुछ याद आ रही है? 'फ़ंक्शन (संदेश) {console.log (संदेश)} (' हैलो ');' परिणाम: 'हैलो' – CgodLEY

+0

@CgodLEY यह मेरे नोड कंसोल में काम नहीं करता है ... (आउटपुट '...') है –

+0

नहीं, नोड मुझे एक वाक्यविन्यास त्रुटि देता है। (वास्तव में मैं इसे समारोह घोषणा में खुले माता-पिता पर प्राप्त करता हूं, क्योंकि फ़ंक्शन नाम के बिना फ़ंक्शन घोषणा गलत है। – Pointy

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