javascript हरण जावास्क्रिप्ट में चर के दायरे क्या है?




हिंदी में जावास्क्रिप्ट परिचय (20)

जावास्क्रिप्ट में चर के दायरे क्या है? क्या उनके पास एक समारोह के बाहर के विपरीत एक ही गुंजाइश है? या इससे कोई फर्क पड़ता है? साथ ही, यदि चर वैश्विक रूप से परिभाषित किए गए चर संग्रहीत होते हैं?


वैश्विक कार्यक्षेत्र :

वैश्विक चर बिल्कुल वैश्विक सितारों (जैकी चैन, नेल्सन मंडेला) की तरह हैं। आप अपने आवेदन के किसी भी हिस्से से उन तक पहुंच सकते हैं (मूल्य प्राप्त या सेट कर सकते हैं)। वैश्विक कार्य वैश्विक घटनाओं (नए साल, क्रिसमस) की तरह हैं। आप उन्हें अपने आवेदन के किसी भी हिस्से से निष्पादित (कॉल) कर सकते हैं।

//global variable
var a = 2;

//global function
function b(){
   console.log(a);  //access global variable
}

स्थानीय दायरा:

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

स्थानीय चर स्थानीय सितारों की तरह हैं। आप दायरे के अंदर केवल उन्हें (मूल्य प्राप्त या सेट कर सकते हैं) तक पहुंच सकते हैं। स्थानीय फ़ंक्शन स्थानीय ईवेंट की तरह होता है - आप उस दायरे के अंदर केवल (जश्न मना सकते हैं) निष्पादित कर सकते हैं। यदि आप उन्हें दायरे के बाहर से एक्सेस करना चाहते हैं, तो आपको एक संदर्भ त्रुटि मिलेगी

function b(){
   var d = 21; //local variable
   console.log(d);

   function dog(){  console.log(a); }
     dog(); //execute local function
}

 console.log(d); //ReferenceError: dddddd is not defined    

दायरे की गहराई से समझने के लिए इस आलेख को देखें


Global: variable declared outside of a function

स्थानीय: एक फ़ंक्शन के अंदर घोषित घोषित, और केवल उस दायरे में ही कहा जा सकता है


कोड चलाओ। उम्मीद है कि यह स्कोपिंग के बारे में एक विचार देगा

Name = 'global data';
document.Name = 'current document data';
(function(window,document){
var Name = 'local data';
var myObj = {
    Name: 'object data',
    f: function(){
        alert(this.Name);
    }
};

myObj.newFun = function(){
    alert(this.Name);
}

function testFun(){
    alert("Window Scope : " + window.Name + 
          "\nLocal Scope : " + Name + 
          "\nObject Scope : " + this.Name + 
          "\nCurrent document Scope : " + document.Name
         );
}


testFun.call(myObj);
})(window,document);

मुझे लगता है कि मैं सबसे अच्छा कर सकता हूं, आपको अध्ययन करने के लिए उदाहरणों का एक समूह प्रदान करता है। जावास्क्रिप्ट प्रोग्रामर व्यावहारिक रूप से रैंक किए जाते हैं कि वे कितनी अच्छी तरह समझते हैं। यह कभी-कभी काफी प्रतिद्वंद्वी हो सकता है।

  1. एक विश्व स्तर पर स्कॉप्ड चर

    // global scope
    var a = 1;
    
    function one() {
      alert(a); // alerts '1'
    }
    
  2. स्थानीय दायरा

    // global scope
    var a = 1;
    
    function two(a) {
      // local scope
      alert(a); // alerts the given argument, not the global value of '1'
    }
    
    // local scope again
    function three() {
      var a = 3;
      alert(a); // alerts '3'
    }
    
  3. इंटरमीडिएट : जावास्क्रिप्ट में ब्लॉक स्कोप जैसी कोई चीज़ नहीं (ES5; ES6 परिचय let )

    ए।

    var a = 1;
    
    function four() {
      if (true) {
        var a = 4;
      }
    
      alert(a); // alerts '4', not the global value of '1'
    }
    

    ख।

    var a = 1;
    
    function one() {
      if (true) {
        let a = 4;
      }
    
      alert(a); // alerts '1' because the 'let' keyword uses block scoping
    }
    
  4. इंटरमीडिएट : ऑब्जेक्ट गुण

    var a = 1;
    
    function Five() {
      this.a = 5;
    }
    
    alert(new Five().a); // alerts '5'
    
  5. उन्नत : बंद करो

    var a = 1;
    
    var six = (function() {
      var a = 6;
    
      return function() {
        // JavaScript "closure" means I have access to 'a' in here,
        // because it is defined in the function in which I was defined.
        alert(a); // alerts '6'
      };
    })();
    
  6. उन्नत : प्रोटोटाइप-आधारित स्कोप रिज़ॉल्यूशन

    var a = 1;
    
    function seven() {
      this.a = 7;
    }
    
    // [object].prototype.property loses to
    // [object].property in the lookup chain. For example...
    
    // Won't get reached, because 'a' is set in the constructor above.
    seven.prototype.a = -1;
    
    // Will get reached, even though 'b' is NOT set in the constructor.
    seven.prototype.b = 8;
    
    alert(new seven().a); // alerts '7'
    alert(new seven().b); // alerts '8'
    
  7. वैश्विक + स्थानीय : एक अतिरिक्त जटिल मामला

    var x = 5;
    
    (function () {
        console.log(x);
        var x = 10;
        console.log(x); 
    })();
    

    यह undefined और 5 और 10 बजाय 10 प्रिंट करेगा क्योंकि जावास्क्रिप्ट हमेशा दायरे के शीर्ष पर परिवर्तनीय घोषणाएं (प्रारंभिकरण नहीं) चलाता है, जिससे कोड बराबर होता है:

    var x = 5;
    
    (function () {
        var x;
        console.log(x);
        x = 10;
        console.log(x); 
    })();
    
  8. खंड-स्कोप्ड चर पकड़ो

    var e = 5;
    console.log(e);
    try {
        throw 6;
    } catch (e) {
        console.log(e);
    }
    console.log(e);
    

    यह 5 , 6 , 5 प्रिंट करेगा। कैच क्लॉज e अंदर वैश्विक और स्थानीय चर शामिल हैं। लेकिन यह विशेष दायरा केवल पकड़े गए चर के लिए है। यदि आप var f; लिखते हैं var f; कैच क्लॉज के अंदर, फिर यह वही है जैसा आपने कोशिश-पकड़ ब्लॉक से पहले या बाद में परिभाषित किया था।


मूल रूप से ब्रेंडन HyperTalk द्वारा डिजाइन किए जाने पर जावास्क्रिप्ट में HyperTalk HyperCard स्क्रिप्टिंग भाषा HyperTalk से आया था।

इस भाषा में, डिस्प्ले इंडेक्स कार्ड के ढेर के समान किए गए थे। पृष्ठभूमि के रूप में संदर्भित एक मास्टर कार्ड था। यह पारदर्शी था और नीचे कार्ड के रूप में देखा जा सकता है। इस बेस कार्ड पर किसी भी सामग्री को इसके ऊपर रखे कार्ड के साथ साझा किया गया था। शीर्ष पर रखे गए प्रत्येक कार्ड की अपनी सामग्री थी जो पिछले कार्ड पर प्राथमिकता लेती थी, लेकिन वांछित होने पर अभी भी पूर्व कार्ड तक पहुंच थी।

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

यह बाध्यकारी युक्त वस्तु को इंगित करेगा। कभी-कभी स्कॉप्स या निष्पादन संदर्भ में ऑब्जेक्ट बदलने के बिना परिवर्तन होता है, जैसे घोषित फ़ंक्शन में जहां युक्त ऑब्जेक्ट window या कन्स्ट्रक्टर फ़ंक्शन हो सकता है।

इन निष्पादन संदर्भों को किसी भी समय नियंत्रण स्थानांतरित किया जाता है। कोड निष्पादित होने पर नियंत्रण स्थानांतरित होता है, और यह मुख्य रूप से फ़ंक्शन निष्पादन से किया जाता है।

तो यह तकनीकी स्पष्टीकरण है। अभ्यास में, जावास्क्रिप्ट में याद रखना महत्वपूर्ण है

  • स्कॉप्स तकनीकी रूप से "निष्पादन संदर्भ" हैं
  • संदर्भ उन वातावरणों का एक ढेर बनाते हैं जहां चर संग्रहित होते हैं
  • ढेर के शीर्ष को प्राथमिकता दी जाती है (नीचे वैश्विक संदर्भ है)
  • प्रत्येक कार्य निष्पादन संदर्भ बनाता है (लेकिन यह हमेशा बाध्यकारी नहीं है)

इस पृष्ठ पर पिछले उदाहरणों में से एक (5. "क्लोजर") में इसे लागू करना, निष्पादन संदर्भों के ढेर का पालन करना संभव है। इस उदाहरण में ढेर में तीन संदर्भ हैं। उन्हें बाहरी संदर्भ द्वारा परिभाषित किया गया है, तत्काल बुलाए गए फ़ंक्शन में संदर्भ छः छः द्वारा संदर्भित किया गया है, और वर्चुअल छः के तत्काल आवंटित फ़ंक्शन के अंदर लौटाए गए फ़ंक्शन में संदर्भ।

i ) बाहरी संदर्भ। इसमें एक = 1 का एक परिवर्तनीय वातावरण है
ii ) आईआईएफई संदर्भ, इसमें एक = 1 का एक व्याख्यात्मक वातावरण है, लेकिन एक = 6 का एक परिवर्तनीय वातावरण जो ढेर में प्राथमिकता लेता है
iii ) लौटा कार्य संदर्भ, इसमें एक = 6 का एक व्याख्यात्मक वातावरण है और यह कॉल किए जाने पर अलर्ट में संदर्भित मान है।


There are two types of scopes in JavaScript.

  1. Global scope : variable which is announced in global scope can be used anywhere in the program very smoothly. उदाहरण के लिए:

    var carName = " BMW";
    
    // code here can use carName
    
    function myFunction() {
         // code here can use carName 
    }
    
  2. Functional scope or Local scope : variable declared in this scope can be used in its own function only. उदाहरण के लिए:

    // code here can not use carName
    function myFunction() {
       var carName = "BMW";
       // code here can use carName
    }
    

केवल दो प्रकार के जावास्क्रिप्ट स्कॉप्स हैं:

  • प्रत्येक विविध घोषणा का दायरा सबसे तत्काल संलग्न कार्य से जुड़ा हुआ है
  • यदि एक विविध घोषणा के लिए कोई संलग्न कार्य नहीं है, तो यह वैश्विक दायरा है

इसलिए, कार्यों के अलावा कोई भी ब्लॉक एक नया दायरा नहीं बनाता है। यह बताता है कि फॉर-लूप बाहरी स्कॉइड चर को ओवरराइट क्यों करते हैं:

var i = 10, v = 10;
for (var i = 0; i < 5; i++) { var v = 5; }
console.log(i, v);
// output 5 5

इसके बजाय कार्यों का उपयोग करना:

var i = 10, v = 10;
$.each([0, 1, 2, 3, 4], function(i) { var v = 5; });
console.log(i,v);
// output 10 10

पहले उदाहरण में, कोई ब्लॉक स्कोप नहीं था, इसलिए प्रारंभिक रूप से घोषित चर ओवरराइट किए गए थे। दूसरे उदाहरण में, फ़ंक्शन के कारण एक नया दायरा था, इसलिए शुरुआत में घोषित चर को छाया दिया गया था, और ओवरराइट नहीं किया गया था।

जावास्क्रिप्ट स्कॉइंग के संदर्भ में आपको लगभग इतना ही पता होना चाहिए, सिवाय इसके कि:

  • केवल अपवाद चर के लिए नए दायरे को पेश करने / पकड़ने का प्रयास करें, अन्य चरों में नया दायरा नहीं है
  • स्पष्ट रूप से एक और अपवाद है, लेकिन क्लॉज के साथ इसका उपयोग अत्यधिक निराश ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with )

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

  • विभिन्न घोषणाओं को दायरे के शीर्ष पर फहराया जाता है। इसका मतलब यह नहीं है कि विभिन्न घोषणाएं कहां होती हैं, कंपाइलर के लिए ऐसा लगता है जैसे var शीर्ष पर होता है
  • एक ही दायरे के भीतर कई var घोषणाएं संयुक्त हैं

तो यह कोड:

var i = 1;
function abc() {
  i = 2;
  var i = 3;
}
console.log(i);     // outputs 1

के बराबर है:

var i = 1;
function abc() {
  var i;     // var declaration moved to the top of the scope
  i = 2;
  i = 3;     // the assignment stays where it is
}
console.log(i);

यह काउंटर अंतर्ज्ञानी प्रतीत हो सकता है, लेकिन यह एक अनिवार्य भाषा डिजाइनर के परिप्रेक्ष्य से समझ में आता है।


ECMAScript 6 introduced the let and const keywords. These keywords can be used in place of the var keyword. Contrary to the var keyword, the let and const keywords support the declaration of local scope inside block statements.

var x = 10
let y = 10
const z = 10
{
  x = 20
  let y = 20
  const z = 20
  {
    x = 30
    // x is in the global scope because of the 'var' keyword
    let y = 30
    // y is in the local scope because of the 'let' keyword
    const z = 30
    // z is in the local scope because of the 'const' keyword
    console.log(x) // 30
    console.log(y) // 30
    console.log(z) // 30
  }
  console.log(x) // 30
  console.log(y) // 20
  console.log(z) // 20
}

console.log(x) // 30
console.log(y) // 10
console.log(z) // 10

जेएस में केवल फ़ंक्शन स्कोप हैं। स्कॉप्स ब्लॉक नहीं! आप देख सकते हैं कि क्या होस्टिंग भी है।

var global_variable = "global_variable";
var hoisting_variable = "global_hoist";

// Global variables printed
console.log("global_scope: - global_variable: " + global_variable);
console.log("global_scope: - hoisting_variable: " + hoisting_variable);

if (true) {
    // The variable block will be global, on true condition.
    var block = "block";
}
console.log("global_scope: - block: " + block);

function local_function() {
    var local_variable = "local_variable";
    console.log("local_scope: - local_variable: " + local_variable);
    console.log("local_scope: - global_variable: " + global_variable);
    console.log("local_scope: - block: " + block);
    // The hoisting_variable is undefined at the moment.
    console.log("local_scope: - hoisting_variable: " + hoisting_variable);

    var hoisting_variable = "local_hoist";
    // The hoisting_variable is now set as a local one.
    console.log("local_scope: - hoisting_variable: " + hoisting_variable);
}

local_function();

// No variable in a separate function is visible into the global scope.
console.log("global_scope: - local_variable: " + local_variable);

जावास्क्रिप्ट कोड (वैश्विक कोड या फ़ंक्शंस) के प्रत्येक हिस्से में इसके साथ जुड़े एक स्कोप चेन है। यह स्कोप श्रृंखला ऑब्जेक्ट्स की एक सूची या श्रृंखला है जो उस कोड के लिए "दायरे में" चर को परिभाषित करती है। जब जावास्क्रिप्ट को एक चर x ( वैरिएबल रिज़ॉल्यूशन नामक एक प्रक्रिया) के मान को देखने की आवश्यकता होती है, तो यह श्रृंखला में पहली वस्तु को देखकर शुरू होती है। यदि उस ऑब्जेक्ट में x नाम की एक संपत्ति है, तो उस संपत्ति का मूल्य उपयोग किया जाता है। यदि पहली ऑब्जेक्ट में x नाम की कोई संपत्ति नहीं है, तो जावास्क्रिप्ट श्रृंखला में अगली ऑब्जेक्ट के साथ खोज जारी रखता है। यदि दूसरी ऑब्जेक्ट में x नाम की कोई संपत्ति नहीं है, तो खोज अगली ऑब्जेक्ट पर जाती है, और इसी तरह। यदि x स्कोप श्रृंखला में किसी भी वस्तु की संपत्ति नहीं है, तो x उस कोड के दायरे में नहीं है, और एक संदर्भ त्रुटि होती है। शीर्ष-स्तरीय जावास्क्रिप्ट कोड (यानी, कोड किसी भी फ़ंक्शन परिभाषाओं में शामिल नहीं है) में, स्कोप श्रृंखला में एक ऑब्जेक्ट, वैश्विक ऑब्जेक्ट होता है। एक गैर-नेस्टेड फ़ंक्शन में, स्कोप श्रृंखला में दो ऑब्जेक्ट होते हैं। पहला वह ऑब्जेक्ट है जो फ़ंक्शन के पैरामीटर और स्थानीय चर को परिभाषित करता है, और दूसरा वैश्विक वस्तु है। नेस्टेड फ़ंक्शन में, स्कोप चेन में तीन या अधिक ऑब्जेक्ट होते हैं। यह समझना महत्वपूर्ण है कि वस्तुओं की यह श्रृंखला कैसे बनाई जाती है। जब कोई फ़ंक्शन डिफिन्ड किया जाता है , तो यह प्रभावी रूप से स्कोप श्रृंखला को संग्रहीत करता है। जब वह फ़ंक्शन इनवॉक्ड किया जाता है , तो यह अपने स्थानीय चर को संग्रहीत करने के लिए एक नई ऑब्जेक्ट बनाता है, और उस नई ऑब्जेक्ट को संग्रहीत स्कोप श्रृंखला में जोड़ता है ताकि वह एक नई, लंबी श्रृंखला बन सके जो उस फ़ंक्शन आमंत्रण के दायरे को दर्शाती है। यह नेस्टेड फ़ंक्शंस के लिए अधिक दिलचस्प हो जाता है क्योंकि प्रत्येक बार बाहरी फ़ंक्शन कहलाता है, आंतरिक फ़ंक्शन को फिर से परिभाषित किया जाता है। Since the scope chain differs on each invocation of the outer function, the inner function will be subtly different each time it is defined—the code of the inner function will be identical on each invocation of the outer function, but the scope chain associated with that code will be different . This notion of a scope chain is crucial for understanding closures .


कुंजी, जैसा कि मैं समझता हूं, यह है कि जावास्क्रिप्ट में अधिक सामान्य सी ब्लॉक स्कोपिंग बनाम कार्य स्कोपिंग है।

इस विषय पर एक अच्छा लेख है।


बस अन्य उत्तरों में जोड़ने के लिए, स्कोप सभी घोषित पहचानकर्ताओं (चर) की एक लुक-अप सूची है, और नियमों का सख्त सेट लागू करता है कि वर्तमान में कोड निष्पादित करने के लिए ये कैसे पहुंच योग्य हैं। यह लुकअप वैरिएबल को असाइन करने के प्रयोजनों के लिए हो सकता है, जो एक एलएचएस (लेफ्टथैंड-साइड) संदर्भ है, या यह उसके मूल्य को पुनः प्राप्त करने के प्रयोजनों के लिए हो सकता है, जो एक आरएचएस (राइटथैंड-साइड) संदर्भ है। ये लुक-अप वे हैं जो जावास्क्रिप्ट इंजन कोड को संकलित और निष्पादित करते समय आंतरिक रूप से कर रहे हैं।

तो इस परिप्रेक्ष्य से, मुझे लगता है कि एक तस्वीर मदद करेगी जो मुझे काइल सिम्पसन द्वारा स्कोप्स और क्लोजर्स ईबुक में मिली है:

अपनी ईबुक से उद्धरण:

इमारत हमारे कार्यक्रम के नेस्टेड स्कोप नियमसेट का प्रतिनिधित्व करती है। इमारत की पहली मंजिल आपके वर्तमान निष्पादन क्षेत्र का प्रतिनिधित्व करती है, जहां भी आप हैं। इमारत का शीर्ष स्तर वैश्विक दायरा है। आप अपनी वर्तमान मंजिल को देखकर एलएचएस और आरएचएस संदर्भों को हल करते हैं, और यदि आपको यह नहीं मिलता है, तो लिफ्ट को अगली मंजिल पर ले जाएं, वहां देखें, फिर अगला, और इसी तरह। एक बार जब आप शीर्ष मंजिल (वैश्विक क्षेत्र) तक पहुंच जाते हैं, तो आप या तो जो खोज रहे हैं उसे ढूंढते हैं, या आप नहीं करते हैं। लेकिन आपको परवाह किए बिना रोकना है।

ध्यान देने योग्य बात यह है कि "पहला मैच मिलने के बाद स्कोप लुक-अप बंद हो जाता है"।

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


Try this curious example. In the example below if a were a numeric initialized at 0, you'd see 0 and then 1. Except a is an object and javascript will pass f1 a pointer of a rather than a copy of it. The result is that you get the same alert both times.

var a = new Date();
function f1(b)
{
    b.setDate(b.getDate()+1);
    alert(b.getDate());
}
f1(a);
alert(a.getDate());

यहां एक उदाहरण दिया गया है:

<script>

var globalVariable = 7; //==window.globalVariable

function aGlobal( param ) { //==window.aGlobal(); 
                            //param is only accessible in this function
  var scopedToFunction = {
    //can't be accessed outside of this function

    nested : 3 //accessible by: scopedToFunction.nested
  };

  anotherGlobal = {
    //global because there's no `var`
  }; 

}

</script>

आप बंद करने की जांच करना चाहते हैं, और निजी सदस्यों को बनाने के लिए उनका उपयोग कैसे करना चाहते हैं


जावास्क्रिप्ट किसी दिए गए फ़ंक्शन के दायरे को स्थापित करने के लिए स्कोप चेन का उपयोग करता है। आमतौर पर एक वैश्विक दायरा होता है, और परिभाषित प्रत्येक कार्य का अपना घोंसला वाला दायरा होता है। किसी अन्य फ़ंक्शन के भीतर परिभाषित कोई भी फ़ंक्शन स्थानीय क्षेत्र से जुड़ा होता है जो बाहरी फ़ंक्शन से जुड़ा होता है। यह हमेशा स्रोत में स्थिति है जो दायरे को परिभाषित करता है।

स्कोप चेन में एक तत्व मूल रूप से एक पॉइंटर के साथ अपने माता-पिता के लिए एक नक्शा है।

एक चर को हल करते समय, जावास्क्रिप्ट सबसे निचले दायरे से शुरू होता है और बाहर की खोज करता है।


"जावास्क्रिप्ट 1.7" में (मोज़िला का जावास्क्रिप्ट का विस्तार) कोई भी बयान के साथ ब्लॉक-स्कोप चर घोषित कर सकता है:

 var a = 4;
 let (a = 3) {
   alert(a); // 3
 }
 alert(a);   // 4

जावास्क्रिप्ट में केवल दो प्रकार का दायरा है:

  1. वैश्विक दायरा : वैश्विक खिड़की के स्तर के दायरे के अलावा कुछ भी नहीं है। यहां, पूरे आवेदन में परिवर्तनीय उपस्थिति।
  2. कार्यात्मक स्कोप : var कीवर्ड वाले फ़ंक्शन के भीतर घोषित वैरिएबल में कार्यात्मक दायरा है।

जब भी कोई फ़ंक्शन कहा जाता है, तो एक चरणीय स्कोप ऑब्जेक्ट बनाया जाता है (और स्कोप चेन में शामिल किया जाता है) जिसके बाद जावास्क्रिप्ट में चर होते हैं।

        a = "global";
         function outer(){ 
              b = "local";
              console.log(a+b); //"globallocal"
         }
outer();

स्कोप श्रृंखला ->

  1. खिड़की का स्तर - a और outer कार्य स्कोप श्रृंखला में शीर्ष स्तर पर हैं।
  2. जब बाहरी फ़ंक्शन को एक नई variable scope object (और स्कोप चेन में शामिल किया जाता है) कहा जाता है तो इसके अंदर परिवर्तनीय b साथ जोड़ा जाता है।

अब जब एक वैरिएबल a आवश्यकता होती है तो यह पहले निकटतम परिवर्तनीय दायरे के लिए खोज करता है और यदि चर वैरिएबल स्कोप श्रृंखला के अगले ऑब्जेक्ट में स्थानांतरित होता है तो यह चर नहीं है। इस मामले में विंडो स्तर है।


विश्व स्तर पर घोषित वैरिएबल का वैश्विक दायरा है। किसी फ़ंक्शन के भीतर घोषित वेरिएबल्स को उस फ़ंक्शन पर स्कॉप्ड किया जाता है, और उसी नाम के छाया वैश्विक चर शामिल होते हैं।

(मुझे यकीन है कि कई सूक्ष्मताएं हैं जो वास्तविक जावास्क्रिप्ट प्रोग्रामर अन्य उत्तरों में इंगित करने में सक्षम होंगे। विशेष रूप से मैं इस पृष्ठ पर आया हूं कि इसका अर्थ किसी भी समय क्या है। उम्मीद है कि यह प्रारंभिक लिंक आपको शुरू करने के लिए पर्याप्त है हालांकि।)


मैंने पाया कि जावास्क्रिप्ट के लिए नए लोगों को यह समझने में परेशानी है कि विरासत भाषा में डिफ़ॉल्ट रूप से उपलब्ध है और फ़ंक्शन स्कोप एकमात्र गुंजाइश है। मैंने पिछले वर्ष के अंत में जेएसपीरेटी नामक एक ब्यूटीफायर को एक विस्तार प्रदान किया। फ़ीचर रंग कोड में स्कोप का कार्य करता है और हमेशा उस दायरे में घोषित सभी चरों में एक रंग को जोड़ता है। क्लोजर को दृष्टि से प्रदर्शित किया जाता है जब एक स्कोप से रंग वाले एक चर को एक अलग दायरे में उपयोग किया जाता है।

इस सुविधा को आजमाएं:

यहां एक डेमो देखें:

यहां कोड देखें:

वर्तमान में यह सुविधा 16 नेस्टेड फ़ंक्शंस की गहराई के लिए समर्थन प्रदान करती है, लेकिन वर्तमान में वैश्विक चर रंग नहीं है।


आधुनिक जेएस, ईएस 6 +, ' const ' और ' let '

आपको अन्य सभी प्रमुख भाषाओं की तरह, आपके द्वारा बनाए गए प्रत्येक चर के लिए ब्लॉक स्कोपिंग का उपयोग करना चाहिए। var अप्रचलित है । यह आपके कोड को सुरक्षित और अधिक रखरखाव बनाता है।

95% मामलों के लिए const का इस्तेमाल किया जाना चाहिए। यह ऐसा करता है इसलिए परिवर्तनीय संदर्भ बदल नहीं सकता है। ऐरे, ऑब्जेक्ट, और डोम नोड गुण बदल सकते हैं और संभवतः const होना चाहिए।

किसी भी चर के लिए पुन: असाइन किए जाने की उम्मीद के लिए इस्तेमाल किया जाना चाहिए। इसमें लूप के भीतर शामिल है। यदि आपने कभी भी प्रारंभिकरण से परे मूल्य बदल दिया है, let उपयोग करें।

ब्लॉक स्कोप का अर्थ है कि वेरिएबल केवल उन ब्रैकेट्स के भीतर उपलब्ध होगा जिनमें इसे घोषित किया गया है। यह आपके दायरे में बनाए गए अज्ञात कार्यों सहित आंतरिक क्षेत्रों में फैला हुआ है।





scope