spec

2016-11-19 7 views
11

में "लेक्सिकल एंटरप्राइज" और "वैरिएबल एंटरप्राइज़" के बीच क्या अंतर है, मैं ECMAScript 2015 specification पढ़ रहा हूं, और "लेक्सिकल एंटरप्राइज़" और "वेरिएबल एंटरप्राइज़" शब्द कई बार उपयोग किए जाते हैं। उन्हें तालिका 23:spec

लेक्सिकल पर्यावरण: इस निष्पादन संदर्भ में कोड द्वारा किए गए पहचानकर्ता संदर्भों को हल करने के लिए उपयोग किए जाने वाले लेक्सिकल पर्यावरण की पहचान करता है।

परिवर्तनीय पर्यावरण: लेक्सिकल एनवायरनमेंट की पहचान करता है जिसका पर्यावरण रिकॉर्ड इस निष्पादन संदर्भ के भीतर वेरिएबलस्टेटमेंट्स द्वारा निर्मित बाइंडिंग रखता है।

LexicalEnvironment और VariableEnvironment एक निष्पादन संदर्भ के घटकों हमेशा शाब्दिक वातावरण हैं। जब एक निष्पादन संदर्भ बनाया जाता है तो इसके लेक्सिकल एंटरप्राइज और वेरिएबल एंटरटेनमेंट घटक प्रारंभ में समान मान होते हैं।

तो, मैं जानना चाहता हूं कि वे अलग कैसे होंगे, और किस स्थितियों में प्रत्येक का उपयोग किया जाता है। क्या कोई समझा सकता है?

+0

[ECMAScript 5 में "LexicalEnvironment" और "VariableEnvironment" के बीच अंतर पर स्पष्टता] के संभावित डुप्लिकेट (http://stackoverflow.com/q/15031667/1048572)? उनका उद्देश्य वास्तव में नहीं बदला गया था, केवल वर्तमान शब्दावली पर्यावरण अधिक बार बदल जाता है (उदाहरण के लिए प्रत्येक ब्लॉक-स्कोप के साथ)। – Bergi

+0

हाँ, मैंने इसे पहले पढ़ा है, लेकिन मुझे अभी भी इसमें कुछ परेशानी है। आपने कहा 'कोशिश करें' कुछ "} पकड़ें (x) {function y() {console.log (x, typeof x);} y(); } ', मैं इसे क्रोम में चलाता हूं, लेकिन' x '@ Bergi –

+0

@SmallTownNE धन्यवाद के लिए कोई संदर्भ त्रुटि नहीं है, मैंने अपडेट किया [उस उत्तर] (http://stackoverflow.com/a/15035083/1048572)। लेकिन "मजेदार तथ्य" वैसे भी पद का सारांश नहीं था - मुख्य बिंदु यह है कि जब आप ब्लॉक स्कोप दर्ज करते हैं तो लेक्सिकल पर्यावरण बदलता है (उदाहरण के लिए 'पकड़', क्योंकि ES6 भी सामान्य ब्लॉक - 'चलो' और 'const' के लिए आदि) – Bergi

उत्तर

6

मैं पोस्ट the question GitHub पर ECMA262 संगठन आधिकारिक करने के लिए पसंद करते हैं, इस सवाल का जवाब है लिटलडन का:

एक लेक्सिकलइन्वायरमेंट एक स्थानीय शब्दावली का दायरा है, उदाहरण के लिए, परिभाषित चर के लिए। यदि आप कैच ब्लॉक में चलिए एक वैरिएबल को परिभाषित करते हैं, तो यह केवल कैच ब्लॉक के भीतर दिखाई देता है, और इसे लागू करने के लिए, हम लेक्सिकल एंटरप्राइज़ का उपयोग करते हैं। परिवर्तनीय पर्यावरण विविधता वाले चर के रूप में चीजों का दायरा है। कार्य को शीर्ष के लिए "hoisting" के रूप में माना जा सकता है। इस spec में इसे लागू करने के लिए, हम कार्यों को एक नया वैरिएबल पर्यावरण प्रदान करते हैं, लेकिन कहते हैं कि ब्लॉक संलग्न वैरिएबल एंटरटेनमेंट का उत्तराधिकारी है।

7

यह एक कठिन है। मैं कुछ सरल उदाहरणों के साथ व्याख्या करने की कोशिश करूंगा। तो एक महत्वपूर्ण बात यह है कि इस प्रश्न में execution context को भी समझना है।

शाब्दिक पर्यावरण

मतलब जहां कोड में कुछ महत्वपूर्ण है लिखें। सभी प्रोग्रामिंग भाषाएं इस तरह नहीं हैं, लेकिन जावास्क्रिप्ट है।

तो अगर आपके पास

function hello() { 
    var myVar = 'hello'; 
} 

की तरह एक समारोह अब चर myVar lexically समारोह के अंदर बैठता है। वह भौतिक रूप से वह कोड है जिसे आप लिख रहे हैं। संक्षेप में, यदि lexical environment के बारे में बात करना है तो इसका अर्थ है कि यह कहां लिखा गया है और इसके आसपास क्या है।

परिवर्तनीय पर्यावरण हर बार जब आप कोई फ़ंक्शन कॉल करते हैं तो एक नया निष्पादन संदर्भ बनाया जाएगा। तो यहां तक ​​कि MyVar को 3 बार घोषित किया गया है (अगला उदाहरण देखें) वे एक दूसरे को छूते नहीं हैं। यही कारण है कि जब आप बात करते है के बारे में Variable Environment

function b() { 
 
    var myVar; 
 
    console.log('three', myVar) // three undefined 
 
           // cause myVar is newly declared in b() 
 
           // but has no value 
 
} 
 

 
function a() { 
 
    var myVar = 2; 
 
    console.log('two', myVar) // two 2 
 
    b(); 
 
} 
 

 
var myVar = 1; 
 
console.log('one', myVar) // one 1 
 
a(); 
 
console.log('four', myVar) // one 1

अब आप जहां अंतर जो मैं इसे सिर्फ दो चीजों के बारे में सैद्धांतिक बात है लगता है के लिए पूछ रहा। लेकिन lexical environment थोडा जानता है कि चर मेमोरी में कहाँ बैठे हैं।

तो यह वास्तव में आपके प्रश्न का उत्तर है। लेकिन मैं यह सुनिश्चित करने के लिए कुछ और उदाहरण दिखाऊंगा कि गलतफहमी के साथ कहां गलत हो सकती है।

क्योंकि वहाँ भी इस बात जावास्क्रिप्ट यदि आप गलत जगह पर कोड लिखने जो आप त्रुटियों दे सकते हैं में hoisting कहा जाता है। और यह अजीब व्यवहार हो सकता है।अगले उदाहरण वास्तव में बहुत सरल हैं, लेकिन सभी Lexical Environemnt, Variable Environment, Execution Context और hoisting

console.log(myVar); // undefined 
 
var myVar = 'hello'; 
 
console.log(myVar); // hello

लेकिन

function a() { 
 
    console.log(myVar) // gives Error myVar is not defined 
 
} 
 
a();

बू पर निर्भर फिर टी:

function a() { 
 
    console.log(myVar); // undefined no Error 
 
         // cause it would take myVar from global 
 
         // execution context 
 
         // but also no error cause we define it again 
 
         // in this function (hoisting) 
 
    var myVar = 0;  // define myVar newly in this lexical environment 
 
    console.log(myVar); // 0 
 
} 
 

 
var myVar = 'hello'; 
 
a(); 
 
console.log(myVar);  // hello

लेकिन फिर अगर हम ऐसा

function a() { 
 
    myVar = 0;   // overwrite global myVar 
 
    console.log(myVar); // 0 
 
} 
 

 
var myVar = 'hello'; 
 
a(); 
 
console.log(myVar);  // 0 did you expect myVar to be 0 ?

+0

आपके उत्तर के लिए धन्यवाद, मैं अपने प्रश्न –

+0

अद्यतन करता हूं, आपकी सलाह के लिए धन्यवाद। –

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