2011-03-24 12 views
26

संभव डुप्लिकेट:! जावास्क्रिप्ट में पिछले कार्य?

!function(){}(); 

के लिए पूर्ववर्ती विस्मयादिबोधक चिह्न क्या है:
What does the exclamation mark do before the function?

मैं एक समारोह पहली बार के लिए यह आज की तरह स्वरूपित देखा था? मुझे लगता है कि यह कार्य करता है:

(function(){})(); 

लेकिन ... यहां क्या हो रहा है?

उत्तर

41

पिछले ! अन-पारदर्शी कथन लेता है, और इसे जेएस इंजन द्वारा पार्स किया जा सकता है, जो बदले में सच हो जाता है।

function(){}(); 
SyntaxError: Unexpected token (

!function(){}(); 
>>true 
+0

बहुत बढ़िया है, धन्यवाद माइक में javascript:alert(!function(){}()) की कोशिश करो। – Stuart

+25

यह इतना भ्रामक है, यह कुछ भी अदृश्य नहीं बनाता है, यह एक फ़ंक्शन घोषणा को एक अभिव्यक्ति के रूप में पार्स किया जाता है, जो फ़ंक्शन को ही मूल्यांकन करता है, इसे कॉल करने की इजाजत देता है। – michelpm

12

यह जावास्क्रिप्ट पार्सर को अभिव्यक्ति के रूप में पार्स बनाता है, जो इसे निष्पादित करने के लिए आवश्यक है।

+1

यह प्रेरणा हो सकती है। लेकिन परिणामी अभिव्यक्ति अभी भी '!' के साथ किसी भी अभिव्यक्ति के रूप में व्यवहार करती है। –

+5

@ मैथ्यू: मैं gaoshan88 के लिए बात नहीं कर सकता, लेकिन ऐसा लगता है कि वह प्रेरणा में रूचि रखता है, क्योंकि उसने स्वयं (निष्पादन) को स्व-निष्पादन कार्यों को लिखने के एक और आम तरीके से तुलना की है। –

12

मैंने कोशिश की है, यह सच हो गया। फ़ंक्शन undefined देता है, और !undefined सत्य है।

!function(){}(); 
^  ^^ 
C   A B 
  • function(){} एक खाली गुमनाम समारोह
  • बी () समारोह (ए) कार्यान्वित करता है, लौटने undefined
  • सी ! नकारता undefined, जो true

हो जाता है मुझे लगता है कि उन्होंने एक कोड गोल्फ या एक obfuscated कोड के लिए उस चाल का इस्तेमाल किया। यह एक बुरा व्यवहार है व्यावहारिक रूप से उपयोग करने के लिए है कि

अपनी ब्राउज़र पता बार

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