यह एक कठिन है। मैं कुछ सरल उदाहरणों के साथ व्याख्या करने की कोशिश करूंगा। तो एक महत्वपूर्ण बात यह है कि इस प्रश्न में 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 ?
[ECMAScript 5 में "LexicalEnvironment" और "VariableEnvironment" के बीच अंतर पर स्पष्टता] के संभावित डुप्लिकेट (http://stackoverflow.com/q/15031667/1048572)? उनका उद्देश्य वास्तव में नहीं बदला गया था, केवल वर्तमान शब्दावली पर्यावरण अधिक बार बदल जाता है (उदाहरण के लिए प्रत्येक ब्लॉक-स्कोप के साथ)। – Bergi
हाँ, मैंने इसे पहले पढ़ा है, लेकिन मुझे अभी भी इसमें कुछ परेशानी है। आपने कहा 'कोशिश करें' कुछ "} पकड़ें (x) {function y() {console.log (x, typeof x);} y(); } ', मैं इसे क्रोम में चलाता हूं, लेकिन' x '@ Bergi –
@SmallTownNE धन्यवाद के लिए कोई संदर्भ त्रुटि नहीं है, मैंने अपडेट किया [उस उत्तर] (http://stackoverflow.com/a/15035083/1048572)। लेकिन "मजेदार तथ्य" वैसे भी पद का सारांश नहीं था - मुख्य बिंदु यह है कि जब आप ब्लॉक स्कोप दर्ज करते हैं तो लेक्सिकल पर्यावरण बदलता है (उदाहरण के लिए 'पकड़', क्योंकि ES6 भी सामान्य ब्लॉक - 'चलो' और 'const' के लिए आदि) – Bergi