Function Declaration V/s Function Expression

Function Declaration V/s Function Expression – जब हम function Keyword के साथ Function को Define करते हैं, तो बनने वाले Entire Statement Block को Function Declaration या Function Definition कह सकते हैं।

लेकिन जब हम किसी Function का Reference किसी Variable में Store करते हैं और उस Variable द्वारा Function के Codes को Execute करते हैं, तो इस प्रकार से Define किए जाने वाले Function को Function Expression कहते हैं।

ECMAScript में Function Declaration व Function Expression दोनों एकदम अलग तरीके से व्यवहार करते हैं। Function Declaration किसी भी Code के Execute होने से पहले JavaScript द्वारा Read होते हैं और Execution के लिए Available होते हैं।

जबकि Function Expression तब तक Complete नहीं होते, जब तक कि JavaScript Interpreter उस Statement तक नहीं पहुंच जाता, जहां पर Function Expression को Specify किया गया है। इस प्रक्रिया को हम निम्न उदाहरण Code Segments द्वारा समझ सकते हैं:

[code]
      alert(sum(10,10));
      function sum(num1, num2){
            return num1 + num2;
      }
[/code]

हम जानते हैं कि JavaScript Interpreter Top to BottomLeft to Right Flow होता है और इस Flow में आने वाले Statements को इसी Flow में Interpret करता है। यानी किसी Script में जो Statement पहले लिखा गया है वह पहले Interpret होता है, जबकि जो Code बाद में लिखा गया है, वह बाद में Interpret होता है।

लेकिन उपरोक्त Code Segment में ऐसा नहीं हो रहा है। हम देख सकते हैं कि हमने alert Function में sum() Function को Call किया है, जबकि sum() Function को alert Function Call करने के बाद Define किया गया है। फिर भी ये Code Segment सामान्‍य तरीके से काम करता है और हमें उपयुक्त ResultProvide करता है।

इसका कारण ये है कि उपरोक्त Code, Function Declaration है। यानी जब JavaScript किसी Script को Interpret करता है, तो सबसे पहले Script में Specified सभी Functions को Scan करके उन्हें Memory Allocate कर देता है।

सभी Functions को Memory Allocate हो जाने के कारण सभी Functions Execution Context में Add हो जाते हैं। फलस्वरूप किसी भी Code के Execute होने से पहले ही JavaScript को पता रहता है कि Current Script में कौन&कौन से Functions,Execution के लिए Available हैं क्योंकि जब किसी Function को किसी Code में Call किया जाता है, तो JavaScript उस Function की Definition को Scope Chain द्वारा Current Execution Context में Search करता है और चूंकि Function Current Execution Context में Add हो चुका है, इसलिए Function Interpret होने के लिए Available रहता है।

इसीलिए जब उपरोक्त Code में sum() Function की Definition से पहले ही alert() Function में sum() Function को Call कर लिया गया है, फिर भी किसी प्रकार की Error के बिना sum() Function Call होता है और अपना Specified काम पूरा करता है यानी अपने Arguments को जोडकर उनका जोड Return करता है।

क्योंकि जब alert() Function में sum() Function को Call करता है, तब JavaScript Scope Chain का प्रयोग करके Current Context में sum() नाम के Function को Search करता है।

चूंकि sum() नाम के Function को Declaration तरीके से Define किया गया है, इसलिए sum() नाम का ये Function पहले ही Execution Context में Add हो चुका होता है, इसलिए Execute होने के लिए Available रहता है।

फलस्वरूप alert() Function,sum() नाम के Function को उसकी Definition पर पहुंचने से पहले ही Execute कर सकता है। इसीलिए बिना किसी Error के JavaScript alert() Function को Execute कर देता है और sum() Function उपयुक्त Result भी Return करता है।

लेकिन जब हम दूसरे तरीके से Function को Define करते हैं, यानी जब हम Function Expression का प्रयोग करते हुए Function को Define करते हैं, तो JavaScript उस Function को तब तक Memory Allocate नहीं करता, जब तक कि उस Function की First Line पर पहुंच नहीं जाता और Function की First Link पर पहुंचने से पहले JavaScript sum नाम के Function को Current Execution Context में Add नहीं करता।

फलस्वरूप यदि हम उपरोक्त Function Definition को ही निम्नानुसार Function Expression के रूप में Specify करें, तो ये Code Segment पहले Code Segment की तरह उपयुक्त Result Return नहीं करेगा बल्कि एक Error Generate करेगा-

[code]
      alert(sum(10,10));
      var sum = function(num1, num2){
            return num1 + num2;
      };
[/code]

उपरोक्त Code में JavaScript sum() Function को तब तक Identify नहीं करेगा जब तक कि वह Function की पहली Line पर नहीं पहुंच जाता, क्योंकि Function Expression को Use करने पर Function Current Execution Context में तब Add होगा जब वह sum नाम के Variable में Initialize हो जाएगा और Function तब तक sum नाम के इस Reference Holder Variable में Initialize नहीं होगा जब तक कि JavaScript Interpreter इस Function Expression की First Line पर पहुंच नहीं जाता। जबकि इस Line पर पहुंचने से पहले ही Function को alert() Function द्वारा Call किया जा रहा है।

परिणाम स्वरूप ये Code Segment “unexpected identifier” नाम की एक Error Generate करेगा क्योंकि alert() Function को sum Function मिलेगा ही नहीं क्योंकि ये Function Scope Chain में तब Available होगा जब JavaScript इस Function की First Line पर पहुंचेगा। इसलिए यदि हम उपरोक्त Code Segment को ही Working Condition में लाना चाहें, तो हमें alert()Function को निम्नानुसार Function Expression के बाद Call करना होगा-

[code]
      var sum = function(num1, num2){
            return num1 + num2;
      };

      alert(sum(10,10));
[/code]

अब ये Code भी वही Result देगा जो Function Declaration का Code Segment दे रहा था।

Advavnce JavaScript in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Advance JavaScript in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

Advance JavaScript in Hindi | Page: 669 | Format: PDF

BUY NOW GET DEMO REVIEWS