2016-11-11 4 views
5

ईएस 5 ने variable object (वीओ) को व्याख्यात्मक वातावरण में बदल दिया। इस तरह के परिवर्तन की प्रेरणा क्या है क्योंकि वीओ पहले से ही धारणा के रूप में बहुत स्पष्ट है?ES5 में परिवर्तनीय वस्तु को लेक्सिकल वातावरण में क्यों बदला गया था?

+1

मुझे सवाल नहीं है? 'परिवर्तनीय वस्तु' के साथ आपका क्या मतलब है? क्या आप उस विनिर्देश परिवर्तन का संदर्भ दे सकते हैं जिसके बारे में आप बात कर रहे हैं? – nils

+0

@nils ने एक लिंक जोड़ा। – Thomson

+2

@MadaraUchiha दिलचस्प, ES3 spec वास्तव में 'वेरिएबल ऑब्जेक्ट' शब्द का उपयोग करता है: http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,% 20 दिसंबर% 201999.pdf (धारा 10.1.3) – nils

उत्तर

2

मुझे लगता है कि परिवर्तनीय वस्तुओं environment records के समान हैं।

एक पर्यावरण रिकॉर्ड पहचानकर्ता बाइंडिंग रिकॉर्ड करता है जो अपने संबंधित लेक्सिकल पर्यावरण के दायरे में बनाए जाते हैं।

ES5 में पर्यावरण रिकॉर्ड की दो अलग अलग प्रकार के होते हैं:

घोषणात्मक पर्यावरण रिकॉर्ड ECMAScript भाषा वाक्यात्मक तत्वों के प्रभाव परिभाषित किया जाता है इस तरह के रूप में FunctionDeclarations, VariableDeclarations, और कैच खंड जो सीधे ईसीएमएस्क्रिप्ट भाषा मूल्यों के साथ पहचानकर्ता बाइंडिंग को जोड़ते हैं। वस्तु पर्यावरण रिकॉर्ड तत्वों कार्यक्रम और WithStatement कि किसी वस्तु के गुणों के साथ पहचानकर्ता बाइंडिंग सहयोगी के रूप में ECMAScript के प्रभाव परिभाषित किया जाता है।

तो सवाल यह होगा कि केवल ईएस 3 परिवर्तनीय वस्तुओं की तरह ऑब्जेक्ट पर्यावरण रिकॉर्ड का उपयोग करने के बजाए घोषणात्मक पर्यावरण रिकॉर्ड पेश किए गए थे।

सभी पर्यावरण द्वारा समर्थित परिवर्तनशील बाइंडिंग के अलावा रिकॉर्ड्स, कथात्मक पर्यावरण रिकॉर्ड भी अपरिवर्तनीय बाइंडिंग के लिए प्रदान करते हैं: अंतर declarative environment records अपरिवर्तनीय बाइंडिंग हो सकता है है। एक अपरिवर्तनीय बाध्यकारी वह है जहां पहचानकर्ता और एक मान के बीच संबंध स्थापित होने के बाद संशोधित नहीं किया जा सकता है।

अपरिवर्तनीय बाइंडिंग में वस्तुओं में प्रत्यक्ष समकक्ष नहीं है। एक संपत्ति को गैर-कॉन्फ़िगर करने योग्य और गैर-लिखने योग्य दोनों के रूप में परिभाषित किया जा सकता है, जो अपरिवर्तनीय हो रहा है। हालांकि,

निर्माण और अपरिवर्तनीय बाध्यकारी हैं अलग चरणों की initialisation तो यह संभव ऐसे बाइंडिंग या तो एक initialised या uninitialised राज्य में मौजूद है।

लेकिन आप एक गैर-आरंभिकृत संपत्ति नहीं हो सकता। यदि आप एक गैर कॉन्फ़िगर करने योग्य गैर-लिखने योग्य संपत्ति को परिभाषित मान के साथ परिभाषित करते हैं, तो आप इसे वांछित मान में प्रारंभ करने में सक्षम नहीं होंगे।

मुझे नहीं लगता कि ईएस 5 में अनियमित अपरिवर्तनीय बाइंडिंग होना संभव है। CreateImmutable बाइंडिंग का उपयोग केवल Declaration Binding Instantiation और Function Definition में किया जाता है, और दोनों मामलों में इसे तुरंत प्रारंभिक Immutable बाइंडिंग के साथ प्रारंभ किया जाता है।

लेकिन संभवत: यह जावास्क्रिप्ट 1.5 const जैसी भाषा के विस्तार के रूप में अनियमित अपरिवर्तनीय बाइंडिंग की अनुमति देने के लिए किया गया था। या शायद वे पहले से ही ES6 const दिमाग में थे।

1

वही लेखक जिसका ईएस 3 लेख आपने लिंक किया है, वह ईएस 5 (और उस खंड को भी लिंक करता है) के बारे में लिखा है। ,

सामान्य स्थिति में कथात्मक रिकॉर्ड की बाइंडिंग सीधे कार्यान्वयन के निम्न स्तर पर संग्रहीत करने के लिए ग्रहण कर रहे हैं (उदाहरण के लिए, एक आभासी मशीन के रजिस्टरों में: मैं अपने "Declarative environment record" section in ECMA-262-5 in detail. Chapter 3.2. Lexical environments: ECMAScript implementation से श्री Soshnikov बोली जाएगा इस प्रकार तेजी से पहुंच प्रदान करते हैं)। ES3 में उपयोग की जाने वाली पुरानी सक्रियण ऑब्जेक्ट अवधारणा से यह मुख्य अंतर है।

है, विनिर्देश नहीं करता है ’ टी की आवश्यकता होती है (और यहां तक ​​कि परोक्ष रूप से ’ नहीं करता है टी सलाह देते हैं) साधारण वस्तुओं जो इस मामले में अक्षम हैं के रूप में कथात्मक रिकॉर्ड को लागू करने। इस तथ्य का नतीजा यह है कि घोषणात्मक पर्यावरण रिकॉर्ड सीधे उपयोगकर्ता स्तर पर प्रकट नहीं किए जाते हैं, जिसका अर्थ है कि हम इन बाइंडिंगों को एक्सेस नहीं कर सकते हैं। रिकॉर्ड के गुण। असल में, हम (सिवाय हालांकि राइनो कार्यान्वयन जो फिर भी __parent__ संपत्ति के माध्यम से यह सामने आ रहा) से पहले ’ टी भी नहीं कर सके, ES3 — वहाँ सक्रियण वस्तु भी एक उपयोगकर्ता के लिए दुर्गम सीधे था में भी।

संभावित, कथात्मक रिकॉर्ड पूरा lexical addressing तकनीक का उपयोग करने की अनुमति है, कि, सभी चर पते (यदि भंडारण निश्चित और अपरिवर्तनीय है किसी भी गुंजाइश श्रृंखला देखने — परवाह किए बिना नेस्टेड गुंजाइश की गहराई के बिना जरूरत चर के लिए सीधी पहुँच प्राप्त करने के लिए है संकलन समय पर भी जाना जा सकता है)। हालांकि, ES5 spec ’ इस तथ्य का सीधे उल्लेख नहीं करता है।

तो एक बार फिर से, मुख्य बात जो हम समझना चाहिए कि ऐसा क्यों कथात्मक पर्यावरण रिकॉर्ड के साथ पुराने सक्रियण वस्तु अवधारणा को बदलने के लिए की जरूरत थी सभी कार्यान्वयन की दक्षता का पहला है।

इस प्रकार, ब्रेंडन Eich भी mentioned (पिछले पैराग्राफ) — ES3 में सक्रियण वस्तु कार्यान्वयन सिर्फ “ एक बग ” था के रूप में: “ मैं वहाँ अध्याय 10 के लिए विशेष रूप से, ES5 में कुछ वास्तविक सुधार हैं कि ध्यान देंगे जो अब घोषणात्मक बाध्यकारी वातावरण का उपयोग करता है। ईएस 1-3 ’ स्कॉप्स के लिए ऑब्जेक्ट्स का दुरुपयोग (फिर से मैं ’ मीटर जेएस में ऐसा करने के लिए दोषी हूं, एक बड़ी जल्दी में भाषा को लागू करने के लिए आवश्यक वस्तुओं पर अर्थशास्त्र) एक बग था, फीचर ”

मुझे नहीं लगता कि मैं इसे किसी भी बेहतर व्यक्त कर सकता हूं।

+0

मैंने कुछ ऐसा सोचा। लेकिन अगर स्पेक ऑब्जेक्ट्स का इस्तेमाल करता है, तो लागू किए जाने वाले व्यवहार संरचनाओं का उपयोग करने के लिए लागू किए जाने वाले अंतर्निहित डेटा संरचनाओं को लागू करने की अनुमति दी जाएगी, है ना? – Oriol

+0

@ ओरियल हाँ, मुझे लगता है कि वे कर सकते हैं, लेकिन यह वास्तव में फिट नहीं है, क्योंकि रिकॉर्ड में एक स्थिर आकार होता है (यह सबसे महत्वपूर्ण अंतर है)। फिर सृजन बनाम प्रारंभिकता है जिसका आप अपने उत्तर में उल्लेख करते हैं, और लुकअप/असाइनमेंट भी काफी अलग काम करता है (प्रोटोटाइप बनाम स्कोप चेन)। – Bergi

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