2010-11-03 18 views
7

कौन सा सर्वोत्तम अभ्यास है, जिसके परिणामस्वरूप बेहतर प्रदर्शन होता है?जावास्क्रिप्ट बंद बनाम वैश्विक चर

अद्यतन: jsperf.com की रिपोर्ट है कि (क) है @ तेजी http://jsperf.com/closure-vs-global-variable

क) को बंद करने

var obj = { 
    init: function() { 
     var self = this; 
     $('#element').click(function() { 
      self.clickEvent(); 
     }); 
    }, 
    clickEvent: function() { 
     this.miscMethod(); 
    }, 
    miscMethod: function() {} 
}; 

ख) वैश्विक चर का उपयोग कर

var obj = { 
    init: function() { 
     // removed self=this closure 
     $('#element').click(this.clickEvent); // simple method handler 
    }, 
    clickEvent: function() { 
     obj.miscMethod(); // global variable used 
    }, 
    miscMethod: function() {} 
}; 
+0

आपका कोड अमान्य वाक्यविन्यास है। – SLaks

+0

मेरा उत्तर देखें, और यह भी लिंक: http://javascript.crockford.com/private.html यह बताता है कि बंद करने के तरीके कैसे काम करते हैं। – JustcallmeDrago

+0

http://jsperf.com/closure-vs-global-variable/5 मुझे बताता है कि (बी) तेज़ है। यह हमें jsperf.com के बारे में क्या सिखाता है? – user123444555621

उत्तर

4

दोनों प्रदर्शन करना चाहिए का उपयोग कर (लगभग) समान रूप से।

सर्वोत्तम अभ्यास ग्लोबल्स से बचने के लिए है।

+0

धन्यवाद, क्या आप विस्तृत कर सकते हैं? मैंने सोचा कि वैश्विक चर घोषित करना सबसे अच्छा था, यह नहीं सुना था कि विधियों के अंदर उनके उपयोग पर भी लागू होता है। क्या इसका कोई कारण है? –

+0

jQuery द्वारा प्रदान की गई डीओएम विधियों को * विशाल * मार्जिन ओवरहेडो द्वारा किसी भी प्रदर्शन अंतर को आप ऊपर दिए गए दो संस्करणों में पहचानने में सक्षम हो सकते हैं। – Hamish

+0

@ मैटी: आपका क्या मतलब है? – SLaks

0

अधिकांश ब्राउज़रों में, कोई महत्वपूर्ण प्रदर्शन अंतर नहीं है; हालांकि, क्रोम 75% slowdownthis का उपयोग कर लगता है (अगर मुझे गलत लगता है तो मेरा त्वरित प्रदर्शन परीक्षण सही करें)। शायद मुख्य सबसे अच्छा अभ्यास मुद्दा यह है कि कभी-कभी अस्पष्ट हो सकता है कि this ऑब्जेक्ट करता है।

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

0

1) चूंकि ग्लोबल्स खतरनाक हैं, इसलिए वैश्विक चर नामों को में सभी कैप्स पर डालने पर विचार करें ताकि वे कोड को पढ़ रहे किसी भी व्यक्ति (आपके समेत) के लिए स्पष्ट हों।

2) आपका पहला स्निपेट मान्य नहीं है।

function obj = { 
    // your object stuff 
} 

var obj = { 
    // your object stuff 
} 

Additionaly होना चाहिए, कि वास्तव में एक बंद नहीं है। यहां बताया गया है कि आप जावास्क्रिप्ट में सिंगलटन को कैसे कार्यान्वित करते हैं।

var mySingleton = (function() { 
    var privateVar = "foo"; 

    function privateFunction() { //this function can only be accessed by other private 
           //and privaleged functions defined in this closure 
     // do stuff. 
    } 

    //stuff to run immediately that will also have access to private variables/functions 

    singletonObj = { 
     key1:"value1", 
     key2:"value2", 
     privilgedFunction: function() { // this method is accessible from the outside 
      // do stuff. you can access private variables in here 
     } 
    }; 

    return singletonObj; //return the object that you just created 
}()); //immediately execute the function, returning an object with private variables 

मैं एक ऐसे फ़ंक्शन का परिणाम निर्दिष्ट कर रहा हूं जिसे मैं तुरंत एक चर के लिए निष्पादित करता हूं। वह फ़ंक्शन एक ऑब्जेक्ट देता है, इसलिए, मैं उस चर को ऑब्जेक्ट असाइन कर रहा हूं। लेकिन उस वस्तु में निजी सदस्य और निजी कार्य भी हैं।

+0

यह एक बंद है, बंद करने के लिए एक सिंगलटन पैटर्न की आवश्यकता नहीं है। (ए) में अज्ञात फ़ंक्शन का निष्पादन संदर्भ संग्रहीत है और इसके बाहरी फ़ंक्शन वेरिएबल्स (स्वयं) तक पहुंच है ... यानी। एक बंद –

+0

ओह, मैंने सोचा था कि आपका "बंद" आपका 'function obj = {}' चीज़ था! – JustcallmeDrago

1

आपके बंद कोड के साथ समस्या यह है कि यह सभी मामलों में काम नहीं करेगा। यदि आप करते हैं:

obj.clickEvent() 

तो यह काम करेगा। लेकिन अगर आप कार्य करें:

var f = obj.clickEvent; 
//hundreds of lines of code 
f(); 

तो यह नहीं, this रूप obj है कि समारोह फोन पर उल्लेख नहीं होगा। यदि आप तुरंत obj को उस चीज़ से दूर करते हैं जो किसी अजीब तरीके से इसका उपयोग नहीं करता है, तो आपको उस समस्या नहीं होगी, इसलिए यह 'क्लीनर' है ... लेकिन मुझे अभी भी लगता है कि गलतियों को करना बहुत आसान है, इसलिए मैं वैश्विक परिवर्तनीय दृष्टिकोण की अनुशंसा करता हूं।

+0

यह भी काम नहीं करेगा क्योंकि 'clickEvent() 'कुछ भी वापस नहीं करता है। – SLaks

+0

@ स्लक्स: आह टाई, निश्चित टाइपो – Claudiu

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