ईसीएमएसक्रिप्ट Function ऑब्जेक्ट (क्लास)
- पिछला पृष्ठ arguments ऑब्जैक्ट
- अगला पृष्ठ क्लोजर (closure)
ECMAScript के फ़ंक्शन वास्तव में पूर्ण कार्यकारी ऑब्जैक्ट हैं。
Function ऑब्जैक्ट (क्लास)
ECMAScript में सबसे रोचक कुछ सबसे अधिक फ़ंक्शन वास्तव में पूर्ण कार्यकारी ऑब्जैक्ट होने की बात है。
Function क्लास किसी भी डेवलपर द्वारा परिभाषित फ़ंक्शन को प्रस्तुत कर सकता है。
Function क्लास के द्वारा फ़ंक्शन को सीधे बनाने के लिए व्याकरण इस प्रकार है:
var function_name = new function(arg1, arg2, ... , argN, function_body)
उपरोक्त रूप में, हर arg एक ही पारामीटर है, अंतिम पारामीटर फ़ंक्शन का मुख्यांश (चलाना होने वाला कोड) है। ये पारामीटर चारी में होने चाहिए。
यहाँ यह फ़ंक्शन याद करें?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
इस तरह भी परिभाषित किया जा सकता है:
var sayHi = new Function("sName", "sMessage", "alert("Hello " + sName + sMessage);");
यद्यपि इस तरह का लेखन कुछ हद तक संकोचित है, लेकिन यह मदद करता है कि फ़ंक्शन एक उपसंकेतक प्रकार का है, वे Function क्लास के द्वारा स्पष्ट रूप से बनाए गए फ़ंक्शन के व्यवहार से एकदम अच्छा समान हैं。
यहाँ एक उदाहरण देखें:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); //आउटपुट "20"
आपको पता है कि दूसरी फ़ंक्शन ने पहली फ़ंक्शन को ओवरलोड किया है, इसलिए doAdd(10) ने "20" निकाला, नहीं कि "30"。
अगर इस तरह से कोड को फिर से लिखा जाए, तो यह संकेतांक स्पष्ट हो जाएगा:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
इस कोड को देखें, स्पष्ट है कि doAdd का मान अब विभिन्न ऑब्जेक्ट की ओर संकेत करने वाला संकेतक हो गया है। फ़ंक्शन का नाम केवल फ़ंक्शन ऑब्जेक्ट के उपसंकेतक है, वह अन्य ऑब्जेक्ट की तरह व्यवहार करता है। यहाँ तक कि दो वेरियेबल को एक ही फ़ंक्शन की ओर संकेत करना संभव है:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); //आउटपुट "20" alsodoAdd(10); //आउटपुट "20"
यहाँ, वेरियेबल doAdd को फ़ंक्शन के रूप में परिभाषित किया गया है, फिर alsodoAdd को उसी फ़ंक्शन की ओर संकेत करने वाला संकेतक घोषित किया गया है। इन दोनों वेरियेबल के द्वारा फ़ंक्शन के कोड को चलाया जा सकता है और एक ही परिणाम - "20" निकाला जा सकता है - इसलिए, अगर फ़ंक्शन का नाम केवल फ़ंक्शन के वेरियेबल के रूप में है, तो फ़ंक्शन को दूसरी फ़ंक्शन को पारामीटर के रूप में भेज सकते हैं! जवाब हाँ है!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //आउटपुट "20"
उपरी उदाहरण में callAnotherFunc() को दो पारामीटर है - बुला देने वाला फ़ंक्शन और फ़ंक्शन को पास किया गया पारामीटर। इस कोड ने doAdd() को callAnotherFunc() फ़ंक्शन को बुलाया, पारामीटर 10 है, आउटपुट "20" दिया।
ध्यान दें:Function बनाने वाले निर्माणकर्ता का उपयोग कर सकते हैं, लेकिन इसे नहीं करना चाहिए, क्योंकि इसके द्वारा फ़ंक्शन को परिभाषित करना पारंपरिक तरीके से करने की तुलना में बहुत अधिक धीमा है। हालांकि, सभी फ़ंक्शन Function वर्ग के उदाहरणों के रूप में देखे जाने चाहिए。
Function ऑब्जैक्ट का length गुण
जैसा कि पहले कहा गया है, फ़ंक्शन संदर्भ प्रकार के हैं, इसलिए उनके पास गुण और विधियाँ भी हैं。
ECMAScript द्वारा परिभाषित गुण length फ़ंक्शन के अपेक्षित पारामीटर्स की संख्या को घोषित करता है। उदाहरण के लिए:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //आउटपुट "1" alert(sayHi.length); //आउटपुट "0"
फ़ंक्शन doAdd() ने एक पारामीटर को परिभाषित किया है, इसलिए इसका length 1 है; sayHi() में पारामीटर को परिभाषित नहीं किया गया है, इसलिए length 0 है。
याद रखें कि, जितने भी पारामीटर्स को परिभाषित किया गया हो, ECMAScript अर्बुद्ध की अनुमति देता है (अधिकतम 25), इस बारे में 'फ़ंक्शन समीक्षा' चापरे में बताया गया है। गुण length केवल डिफ़ॉल्ट में अपेक्षित पारामीटर्स की संख्या को देखने के लिए एक सुविधा प्रदान करता है।
Function ऑब्जैक्ट की विधियाँ
Function ऑब्जैक्ट भी सभी ऑब्जैक्टों के साथ साझा valueOf() और toString() विधियाँ हैं। ये दोनों विधियाँ फ़ंक्शन के स्रोत कोड को वापस देती हैं, जो डिबगिंग के दौरान विशेष रूप से उपयोगी हैं। उदाहरण के लिए:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
इस कोड के उपरी भाग में doAdd() फ़ंक्शन का टेक्स्ट आउटपुट किया गया है。स्वयं प्रयोग कीजिए!
- पिछला पृष्ठ arguments ऑब्जैक्ट
- अगला पृष्ठ क्लोजर (closure)