दिलचस्प पोस्ट
पता कैसे करें कि विंडोज बंद हो रहा है या पुनरारंभ हो रहा है एक सेट से एक तत्व प्राप्त करना क्या html टैग के लिए अपरकेस अक्षरों का उपयोग करना बुरा है? मैं इसमें शामिल होने के बजाय LINQ शामिल (स्ट्रिंग ) का उपयोग कैसे करूं? रूबी में डिबगिंग 1.9 GetLastError () द्वारा दिए गए त्रुटि कोड से त्रुटि संदेश कैसे प्राप्त करें? कैसे जीआईटी के लिए पासवर्ड के साथ कमान दर्ज करें? JSoup UserAgent, इसे सही कैसे सेट करें? सीएसएस में इमेज ब्राइटनेस को कैसे घटाएं उद्देश्य सी – आज से कल (कल) प्राप्त करें केवल एक .xib फ़ाइल का उपयोग करके चित्र और परिदृश्य के लिए वैकल्पिक IOS लेआउट std :: function का केवल-लेवल संस्करण क्रोम हमेशा वेबकैम को http पर अनुमति देता है कैसे जावास्क्रिप्ट यूनिट परीक्षणों में स्थानीय संग्रह नकली? टॉमकेट में जड़ में अपने आवेदन को नियोजित करना

क्या dereferencing चर के लिए एक बंद है उपयोगी?

मुझे यकीन नहीं है कि क्या या जब यह उपयोगी है (प्रदर्शन में सुधार करने के लिए) dereference चर के लिए

var x = abcd[some_key].f; while (loop) { do_something_with(x); } 

तुलना में बेहतर लगता है

 while (loop) { do_somthing_with(abcd[some_key].f); } 

क्या यह आवश्यक है या क्या यह स्मार्ट जावास्क्रिप्ट इंजन द्वारा स्वचालित रूप से किया जाता है?

लेकिन मेरा वास्तविक प्रश्न यह है कि मुझे ऐसा करना चाहिए, उदाहरण के लिए, एक पुस्तकालय में

 (function() { var slice = Array.prototype.slice; Function.prototype.x = function x() { var args = slice.call(arguments, 0); ... }; })(); 

या केवल

 Function.prototype.x = function x() { var args = Array.prototype.slice.call(arguments, 0); ... }; 

इंजन स्वत: यह सुधार नहीं सकता क्योंकि यह नहीं जानता कि क्या Array.prototype.slice रन टाइम के दौरान बदल सकता है।

इसलिए: स्लाइस फंक्शन के लिए स्थानीय संदर्भ बनाने के लिए एक बंद का निर्माण करता है, स्क्रिप्ट को तेज़ी से बनाते हैं? या अतिरिक्त बंद करने की गुंजाइश क्या सरणी के "प्रोटोटाइप" की संपत्ति "टुकड़ा" तक पहुंचने से धीमी है?

Solutions Collecting From Web of "क्या dereferencing चर के लिए एक बंद है उपयोगी?"

"Dereferencing" वास्तव में उस उद्देश्य के लिए एक भ्रमित शब्द है ऐसा नहीं है कि, आप एक स्थानीय चर में कुछ संपत्ति / पद्धति को कैश करते हैं। यह वास्तव में कोई फर्क नहीं पड़ता कि क्या आप इसे किसी रैंडम ऑब्जेक्ट पर कुछ संपत्ति / विधि का उपयोग करने के लिए करते हैं या इसे Array.prototype.slice साथ Array.prototype.sliceArray.prototype.slice . Array.prototype.slice जैसे ही आप उन गहन नेस्टेड गुणों को एक बार से अधिक एक्सेस करते हैं, यह बहुत समझदारी बनाता है

Tbh, "आधुनिक" ब्राउज़र बहुत अधिक उपयोग का अनुकूलन करते हैं सभी आधुनिक जे एस इंजन एक्सेसड प्रॉपर्टी के लिए आंतरिक लुक-अप टेबल का उपयोग करता है। हालांकि, आप पुराने इंजीनियरों में से अब भी गहरी नीडि़त सामान कैश करना चाहते हैं, इसे हल करने के लिए सभी शामिल वस्तुओं के माध्यम से पूरी तरह से नीचे जाना होगा।

स्थानीय कैश किए गए संदर्भों का उपयोग करने के लिए एक और कारण यह है कि आधुनिक जेएस इंजन भी किसी प्रकार के स्पष्ट या अंतर्निहित eval तंत्र के उपयोग के बाद ही हैश-लुकअप का उपयोग नहीं करेंगे।

खासकर इंटरनेट एक्सप्लोरर <9 और फ़ायरफ़ॉक्स 3.5 में एक (प्रोटोटाइप) श्रृंखला में प्रत्येक अतिरिक्त कदम के साथ एक भयानक प्रदर्शन जुर्माना लगाया गया है।


सावधानी के एक शब्द: ऑब्जेक्ट विधियों के लिए स्थानीय कैशिंग का उपयोग करने की सिफारिश नहीं की जाती है (जैसे आप slice विधि के साथ करते हैं)। कई ऑब्जेक्ट this संदर्भ को निर्धारित करने के लिए इसका इस्तेमाल करते हैं, जिसमें ये बोइंग कहा जाता है। स्थानीय वैरिएबल में एक विधि को संग्रहीत करने के कारण this global object या null लिए बाध्य है। इसलिए हमेशा मैन्युअल रूप से संदर्भ सेट करने के लिए method.call साथ इस तरह की विधि को कॉल करना सुनिश्चित करें

यदि आप एक से अधिक संपत्ति का उपयोग करने का इरादा रखते हैं, तो इसे स्थानीय चर में निर्दिष्ट करने पर विचार करें। हालांकि, आधुनिक जावास्क्रिप्ट इंजन जैसे माइक्रो-ऑप्टिमाइजेशन बहुत कम अंतर करेंगे, सबसे महत्वपूर्ण चीज यह है कि कोड लिखना जो आपके इरादों को व्यक्त करता है।

इस विशेष मुद्दे के लिए, आप उस के लिए एक सुविधा फ़ंक्शन भी चाहते हैं:

 function toArray( arrayLike ) { return Array.prototype.slice.call( arrayLike ); } 

… या यदि आप प्रदर्शन के बारे में ध्यान रखते हैं:

 var toArray = (function () { var slice = Array.prototype.slice; return function ( arrayLike ) { return slice.call( arrayLike ); }; })(); 

आप उस slice.call नहीं करना चाहते हैं, जो आपके सभी slice.call निर्माण करते हैं …