यह काम नहीं करता है क्योंकि इसे एक के रूप में पार्स किया जा रहा है FunctionDeclaration, और फ़ंक्शन घोषणाओं का नाम पहचानकर्ता अनिवार्य है ।
जब आप इसे कोष्ठक के साथ घेरते हैं, तो इसका मूल्यांकन ए के रूप में किया जाता है FunctionExpression, और फ़ंक्शन अभिव्यक्तियों को नाम दिया जा सकता है या नहीं।
इस FunctionDeclarationतरह दिखता है का व्याकरण :
function Identifier ( FormalParameterListopt ) { FunctionBody }
और FunctionExpressionएस:
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
जैसा कि आप देख सकते हैं Identifier(आइडेंटिफ़ायर ऑप्ट ) टोकन FunctionExpressionवैकल्पिक है, इसलिए हम बिना परिभाषित नाम के एक फ़ंक्शन अभिव्यक्ति कर सकते हैं:
(function () {
alert(2 + 2);
}());
या नामित समारोह अभिव्यक्ति:
(function foo() {
alert(2 + 2);
}());
कोष्ठक (औपचारिक रूप से ग्रुपिंग ऑपरेटर कहा जाता है ) केवल अभिव्यक्तियों को घेर सकता है, और एक फ़ंक्शन अभिव्यक्ति का मूल्यांकन किया जाता है।
दो व्याकरण निर्माण अस्पष्ट हो सकते हैं, और वे उदाहरण के लिए बिल्कुल एक जैसे दिख सकते हैं:
function foo () {} // FunctionDeclaration
0,function foo () {} // FunctionExpression
पार्सर जानता है कि यह एक FunctionDeclarationया एक है FunctionExpression, संदर्भ के आधार पर जहां यह प्रकट होता है।
उपरोक्त उदाहरण में, दूसरा एक अभिव्यक्ति है क्योंकि कॉमा ऑपरेटर केवल अभिव्यक्तियों को भी संभाल सकता है।
दूसरी ओर, FunctionDeclarationवास्तव में केवल वही दिखाई दे सकता है जिसे " Program" कोड कहा जाता है , जिसका अर्थ है वैश्विक दायरे में बाहर कोड, और FunctionBodyअन्य कार्यों के अंदर ।
ब्लॉक के अंदर के कार्यों से बचा जाना चाहिए, क्योंकि वे अप्रत्याशित व्यवहार का नेतृत्व कर सकते हैं, उदाहरण के लिए:
if (true) {
function foo() {
alert('true');
}
} else {
function foo() {
alert('false!');
}
}
foo(); // true? false? why?
उपरोक्त कोड वास्तव में एक का उत्पादन करना चाहिए SyntaxError, क्योंकि Blockइसमें केवल कथन हो सकते हैं (और ECMAScript विनिर्देश किसी फ़ंक्शन स्टेटमेंट को परिभाषित नहीं करता है), लेकिन अधिकांश कार्यान्वयन सहिष्णु हैं, और बस दूसरा फ़ंक्शन लेगा, जो अलर्ट करता है 'false!'।
मोज़िला कार्यान्वयन-राइनो, स्पाइडरमोंकी, - का एक अलग व्यवहार है। उनके व्याकरण में एक गैर-मानक फ़ंक्शन स्टेटमेंट होता है, जिसका अर्थ है कि फ़ंक्शन का मूल्यांकन रन-टाइम पर किया जाएगा , पार्स समय पर नहीं, क्योंकि यह FunctionDeclarationएस के साथ होता है । उन कार्यान्वयनों में हम पहला फ़ंक्शन परिभाषित करेंगे।
कार्य विभिन्न तरीकों से घोषित किए जा सकते हैं, निम्नलिखित की तुलना करें :
1- एक समारोह के साथ परिभाषित समारोह चर करने के लिए सौंपा निर्माता गुणा :
var multiply = new Function("x", "y", "return x * y;");
2- एक फ़ंक्शन की घोषणा एक फ़ंक्शन का नाम गुणा :
function multiply(x, y) {
return x * y;
}
3 एक समारोह अभिव्यक्ति चर करने के लिए सौंपा गुणा :
var multiply = function (x, y) {
return x * y;
};
4- एक नामित समारोह अभिव्यक्ति FUNC_NAME , चर करने के लिए सौंपा गुणा :
var multiply = function func_name(x, y) {
return x * y;
};