Arguments Passing in JavaScript

जैसाकि हमने पहले भी कहा कि ECMAScript में किसी Function में Pass किए जाने वाले सारे Arguments By Value Pass होते हैं। इसका मतलब ये है कि Function के बाहर से आने वाले Variables के मान Function के अन्दर Specify किए गए Variables में By Value Copy होते हैं, ठीक उसी तरह से जिस तरह से एक Variable का Actual मान दूसरे Variable में Copy होता है, जैसाकि उपरोक्त Discussion में बताया गया है।

यदि Function Argument के रूप में Pass होने वाला मान Primitive हो, तो Arguments Copy होने की प्रक्रिया बिल्कुल वैसी ही होती है, जैसा उपरोक्त Discussion में Primitive Values के Copy होने के सम्बंध में बताया गया है।

लेकिन यदि Function में Pass होने वाला Argument एक Reference हो, तो ये Reference उपरोक्त Discussion में बता, अनुसार एक Reference Value की तरह Copy होता है न कि Object की Actual Value की तरह।

यानी Function से बाहर व Function के अन्दर, दोनों स्थानों के Variables समान Object को Refer करते हैं, क्योंकि Function के Variable में भी Object का Reference ही Copy होता है, न कि Actual Object की Values Copy होती है, जैसाकि उपरोक्त Discussion में बताया गया है।

यानी जब किसी Function में किसी Argument को By Value (Primitive) Pass किया जाता है, तब वह मान Function के किसी NamedArgument या arguments Object की किसी Location पर Store होता है यानी Copy होता है।

जबकि किसी Argument को By Reference (Object) Pass करने पर उस Object का केवल Reference ही Function के किसी Named Argument या arguments Object के किसी Location पर Store होता है।

चूंकि जब Arguments By Value Pass होते हैं, तब Function के Variables Actual Variables से अलग होते हैं। इसलिए Function के अन्दर किसी Argument Variable के मान में किसी तरह का परिवर्तन करने का प्रभाव Function के बाहर के उस Variable के मान पर नहीं पडता, जिसका मान Function के Argument Variable में आया है। जैसे-

[code]
function add20(val) {
      val+=20;
      return val;
}

var count = 20;
var res = add20(count);
alert(count);              //Output: 20 – No Change
alert(res);                //Output: 40
[/code]

उपरोक्त Code में हमने count नाम के Variable में मान 20 Initialize किया है। जब हम इस count Variable को Function में Argument के रूप में Pass करते हैं, तब इस Variable का मान Function के Variable val में Copy हो जाता है, जहां Function के अन्दर Variable Val के मान में 20 जोडने के बाद उसे फिर से Calling Function को Return किया जाता है।

जब हम Function से Return होने वाले Result को Hold करने वाले Variable rescount दोनों का मान Alert Box द्वारा Screen पर Display करते हैं, तो हमें res का मान 40 मिलता है, जबकि count के मान में कोई परिवर्तन नहीं होता और उसका मान 20 ही रहता है। ऐसा इसलिए होता है, क्योंकि count और Function Argument val, दो अलग-अलग Variables हैं, जिनमें समान Values Stored हैं।

लेकिन जब Arguments के रूप में हम किसी Object के Reference को Pass करते हैं, तब Argument Variable व Actual Variables दोनों दो अलग Variables होते हुए भी समान Object को ही Refer करते हैं।

इसलिए यदि Function के अन्दर Reference Hold करने वाले Argument Variable द्वारा Object के मान को Change किया जाए, तो Object का Actual मान Change होता है। फलस्वरूप Function के बाहर के Variable पर भी Change का Effect Reflect होता है। इसे समझने के लिए हम निम्न उदाहरण देख सकते हैं:

[code]
function setName(obj) {
      obj.name = "Kuldeep";
}
var person = new Object();
setName(person);
alert(person.name);        //Output: Kuldeep
[/code]

इस उदाहरण में हमने person नाम के एक Variable में एक नए Create होने वाले Object का Reference Hold किया है। फिर अगली Line में हमने setName() नाम के Method को Call किया है और Argument के रूप में नए Create होने वाले Object का Reference Pass किया है, जिसे Function में obj Argument Variable में प्राप्त किया गया है।

चूंकि personobj दोनों ही Reference Variables हैं, इसलिए दोनों ही समान Object को Refer कर रहे हैं। फिर हमने Function में obj Object के साथ एक नए name Property को Add किया है और उसमें Values के रूप में “Kuldeep” String को Assign किया है।

हालांकि हमने नई Property obj Object के लिए Create की है, लेकिन चूंकि objperson दोनों समान Global Object को ही Refer कर रहे हैं, इसलिए ये Property person के लिए भी Create हो गई है।

अत: अब जब हम Alert Box में person.name Statement द्वारा Person के नाम को Display करवाना चाहते हैं, तो वह नाम Person के लिए भी Display होता है, जबकि वह नाम हमने obj के लिए Assign किया था।

यानी जब हम किसी Function में किसी Object को Argument के रूप में Pass करते हैं और वह Function उस Object में किसी तरह का परिवर्तन करता है, तो उस परिवर्तन का प्रभाव Function के बाहर भी पडता है।

ध्‍यान रखने वाली एक सबसे महत्वपूर्ण बात ये है कि वास्तव में JavaScript में Object जब किसी Function में Argument के रूप में Pass होते हैं, तब वे भी सामान्‍य Primitive Variables की तरह ही By Value Pass होते हैं, लेकिन चूंकि उनमें किसी Object का Reference होता है।

इसलिए Function के अन्दर यदि उस Reference वाले Object की Values को Change किया जाए, तो Function के बाहर भी उसका Effect Reflect होता है, जिसका साफ-सुथरा मतलब यही है कि Function के अन्दर वह Argument Variable एक Global Object को Refer कर रहा है न कि Object के Reference को। इसे समझने के लिए हम एक और उदाहरण देखते हैं जो कि पिछले उदाहरण का ही Modified रूप है:

[code]
function setName(obj) {
      obj.name = "Kuldeep";
      obj = new Object();
      obj.name="Mishra";
}

var person = new Object();
setName(person);
alert(person.name);         //Output: Kuldeep
[/code]

इस उदाहरण में हमने setName Function में एक नया Object Create किया है और उस Object का Reference भी obj में Store कर दिया है। फिर हमने इस नए Object में name नाम की एक Property Create की है और उसमें Value के रूप में “Mishra” String को Store कर दिया है। लेकिन जब हम Output देखते हैं, तब हमें पिछले Program और इस Program यानी दोनों Programs के Output में कोई परिवर्तन दिखाई नहीं देता।

सामान्‍यत: हमें ऐसा लग सकता है कि Function में Create किया गया नया Object Argument के रूप में आने वाले Object के Reference को Override कर देगा और obj में अब “Kuldeep” के स्थान पर “Mishra” String होगा।

लेकिन ऐसा नहीं होता। क्योंकि Function के अन्दर Create होने वाला Object एक Local Object है, इसलिए जैसे ही Function Terminate होता है, ये Object भी Destroy हो जाता है।

जबकि जो Object Reference Argument के रूप में Function में Pass हुआ था, वह Object अभी भी Available है, इसीलिए तो Alert Box में हमें String “Kuldeep” दिखाई देता है।

जिसका मतलब यही है कि Function में Pass होने वाला Object वास्तव में By Reference नहीं बल्कि By Value ही Pass हो रहा है और जो Object Pass हो रहा है, वह एक Global Object है न कि किसी Object का Reference है।

यदि ये किसी Object का Reference होता, तो Function के अन्दर Create होने वाले नए Object का Reference obj में Store करने पर वह Object Destroy हो जाता, जिसे Argument के रूप में Pass किया गया था, जबकि ऐसा नहीं हो रहा है।

यदि सारांश के रूप में समझें, तो ECMAScript में Function Argument एक साधारण से Local Variable से ज्यादा और कुछ नहीं होता और Function के हर Argument को एक Local Variable मानकर ही Coding करनी चाहिए न कि किसी Object कर Reference या Pointer मानकर।

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