2009-03-30 1 views
16

मैं YUI सीख रहा हूं और कभी-कभी इस मुहावरे को देखा है:जावास्क्रिप्ट मुहावरे: केवल इसे आमंत्रित करने के लिए एक फ़ंक्शन बनाएं

 <script> 
    (function x(){ do abcxyz})(); 
</script> 

वे इसे आमंत्रित करने के लिए एक फ़ंक्शन क्यों बनाते हैं? क्यों न लिखें:

<script> 
    do abcxyz 
</script> 

उदाहरण के लिए here देखें।

+0

यह भी देखें: http://stackoverflow.com/questions/631187/javascript-scope-and-closure/ –

उत्तर

44

वे closures का लाभ उठा रहे हैं।

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

उदाहरण के लिए, मान लीजिए कि मैं एक वैश्विक अद्वितीय आईडी जेनरेटर बनाना चाहता हूं। काउंटर साथ

var counter = 0; 
var genId = function() 
{ 
    counter = counter + 1; 
    return counter; 
} 

हालांकि, अब किसी को भी छेड़छाड़ न कर सके, और अब मैं दो चर (काउंटर और genId) के साथ वैश्विक नामस्थान प्रदूषित किया है: एक इस तरह कोड कर सकते हैं।

इसके बजाय, मैं अपने काउंटर समारोह उत्पन्न करने के लिए एक गुमनाम समारोह इस्तेमाल कर सकते हैं:

var genId = function() 
{ 
    var counter = 0; 
    var genIdImpl = function() 
    { 
     counter = counter + 1; 
     return counter; 
    } 

    return genIdImpl; 
}(); 

अब, मैं केवल वैश्विक नाम स्थान है, जो फायदेमंद है में एक चर है। सबसे महत्वपूर्ण बात यह है कि काउंटर वैरिएबल अब संशोधित होने से सुरक्षित है - यह केवल अज्ञात फ़ंक्शन के दायरे में मौजूद है, और इसलिए केवल फ़ंक्शन genIdImpl (जिसे एक ही दायरे में परिभाषित किया गया था) इसे एक्सेस कर सकता है।

यह वाईयूआई के उदाहरण कोड में दिखता है, वे सिर्फ उस कोड को निष्पादित करना चाहते हैं जो वैश्विक नामस्थान को प्रदूषित नहीं करता है।

3

वे नामस्थान टकराव से बचना चाहते हैं, मुझे लगता है। जेएस में एक अच्छा अभ्यास के रूप में लगता है।

संबंधित मुद्दे