2012-09-08 46 views
8

अगर मैं एक स्क्रिप्ट जिसका एकमात्र स्रोत लाइन एक वस्तु है निष्पादित करने के लिए प्रयास करें:जावास्क्रिप्ट में एक वाक्यविन्यास त्रुटि पर एक अज्ञात फ़ंक्शन क्यों है?

{prop:'value'} 

यह ठीक से पार्स (दोनों V8 और UglifyJS में)। इसी तरह मैं स्रोत कोड के रूप में स्वयं एक स्ट्रिंग या संख्या डाल सकता हूं और कोई वाक्यविन्यास त्रुटि रिपोर्ट नहीं की गई है।

हालांकि, दोनों V8 और UglifyJS अपने आप ही इस बारे में शिकायत:

function(){} 

मैं Uncaught SyntaxError: Unexpected token ( मिलता है।

यह तो क्यों टूटता है जब पहले उदाहरण में ऑब्जेक्ट ठीक है? जावास्क्रिप्ट में सिर्फ ऑब्जेक्ट्स नहीं हैं?

मुझे एहसास हुआ कि बिना किसी अज्ञात फ़ंक्शन को निष्पादित किए बिना यह कुछ भी नहीं करेगा; यह सवाल नहीं है। मैं जानना चाहता हूं कि यह एक पार्स त्रुटि क्यों उत्पन्न करता है।

+0

वैसे यह एक फ़ंक्शन नाम गायब है क्योंकि फ़ंक्शन घोषित करने से नियम 'फ़ंक्शन [नाम]() {[code]}' होता है, इसलिए वास्तविक प्रश्न हो सकता है: ऐसे विशेष परिस्थितियां क्यों हैं जहां आप एक अज्ञात फ़ंक्शन बना सकते हैं? – yoshi

+0

एक "अज्ञात फ़ंक्शन" वैकल्पिक नाम के बिना एक फ़ंक्शन अभिव्यक्ति अधिक सही ढंग से है (देखें [FunctionExpression] (http://ecma-international.org/ecma-262/5.1/#sec-A.5))। – RobG

+0

दिलचस्प क्या है बस कुछ ऑपरेटर जोड़ें और यह काम करता है :) '! फ़ंक्शन() {}; + फ़ंक्शन() {};' – abuduba

उत्तर

11

ECMAScript कल्पना से, अभिव्यक्ति बयान पर धारा 12.4:

कृपया ध्यान दें कि ExpressionStatement एक खोलने घुंघराले ब्रेस के साथ शुरू नहीं कर सकते क्योंकि यह है कि यह एक ब्लॉक के साथ अस्पष्ट बना सकता है। साथ ही, एक अभिव्यक्ति स्टेटमेंट function कीवर्ड से शुरू नहीं हो सकता है क्योंकि इससे फ़ंक्शन डिक्लेरेशन के साथ संदिग्ध हो सकता है।

हालांकि कार्य केवल वस्तुएं हैं, याद रखें कि आप वास्तव में अभिव्यक्तियों में अपनी वस्तुओं का उपयोग किए बिना अपने कार्यों को घोषित कर सकते हैं। यही वह जगह है जहां अस्पष्टता झूठ बोलती है। अनुमोदित, आप कभी भी एक अज्ञात फ़ंक्शन घोषित नहीं कर सकते (क्योंकि आप इसे किसी भी तरह से संदर्भित नहीं कर पाएंगे), लेकिन जैसा कि मुझे अज्ञात फ़ंक्शन और नामित फ़ंक्शन घोषणाओं के बीच अंतर करने वाले spec में कुछ भी नहीं मिला है, मुझे संदेह है दोनों पर लागू होता है।

आदेश अस्पष्टता आप कोष्ठक में लपेट की जरूरत को हल करने के लिए, तो वह हमेशा अभिव्यक्ति के रूप में माना जाएगा:

(function(){}) 
+0

आप सही हैं, कोष्ठक कार्यों में लपेट रहे हैं। मैं यह देखने में असफल रहा कि कैसे कार्य() {} 'संदिग्ध है। इसका क्या मतलब हो सकता है? – Flash

+2

@ एंड्रयू- यह संदिग्ध होगा क्योंकि यह एक कार्य अभिव्यक्ति हो सकता है। ध्यान दें कि किसी भी कोड को निष्पादित करने से पहले फ़ंक्शन घोषणाएं संसाधित की जाती हैं, कोड निष्पादित होने पर फ़ंक्शन एक्सप्रेशन संसाधित होते हैं। – RobG

+0

@RobG आपका मतलब है कि यह एक समारोह घोषणा हो सकती है? यह कैसे हो सकता है - इसका कोई नाम नहीं है। – Flash

5

{prop:'value'} एक वस्तु के रूप में पार्स नहीं है, सिर्फ एक ब्लॉक, के रूप में पार्स जो एक लेबल prop है।

आपको अभिव्यक्ति के रूप में विश्लेषण करने के लिए इसे () की आवश्यकता है।

({prop: 'value'}) ऑब्जेक्ट अभिव्यक्ति के रूप में पार्स किया जाएगा।

(function(){}) फ़ंक्शन अभिव्यक्ति के रूप में पार्स किया जाएगा।