2012-10-17 14 views
18

जावास्क्रिप्ट बंद परिभाषा का कहना है:मुफ्त चर क्या हैं?

ए 'बंद' एक अभिव्यक्ति (आमतौर पर एक समारोह) एक वातावरण है कि वे चर बांधता (है कि "बंद कर देता है" अभिव्यक्ति) के साथ मुक्त वैरिएबल नहीं कर सकते हैं।

क्या कोई मुझे मुफ्त चर की अवधारणा समझा सकता है? क्या यह अवधारणा जावास्क्रिप्ट विशिष्ट है या अन्य भाषाओं पर भी लागू होती है?

+3

एक नि: शुल्क चर केवल एक चर है जिसे किसी दिए गए फ़ंक्शन के अंदर घोषित नहीं किया जाता है, लेकिन इसके अंदर उपयोग किया जाता है। –

उत्तर

22

नि: शुल्क चर केवल वे चर हैं जिन्हें न तो स्थानीय रूप से घोषित किया जाता है और न ही पैरामीटर के रूप में पारित किया जाता है।

Source :

कंप्यूटर प्रोग्रामिंग में, शब्द मुक्त चर चर एक समारोह में प्रयोग किया जाता है कि नहीं है और न ही स्थानीय चर कि समारोह के मापदंडों हैं को दर्शाता है। 1 गैर-स्थानीय चर शब्द अक्सर संदर्भ में समानार्थी है।

जावास्क्रिप्ट बंद, उन बस चर समारोह लेता है (पढ़ने और लिखने) संलग्न गुंजाइश जहां बंद घोषित किया जाता है या एक माता पिता के दायरे में हैं। इस वास्तविक दुनिया उदाहरण पर

देखो:

Gol.prototype._ensureInit = function() { 
    ... 
    var _this = this; 
    var setDim = function() { 
     _this.w = _this.canvas.clientWidth; 
     _this.h = _this.canvas.clientHeight; 
     _this.canvas.width = _this.w; 
     _this.canvas.height = _this.h; 
     _this.dimChanged = true; 
     _this.draw(); 
    }; 
    setDim(); 
    window.addEventListener('resize', setDim); 
    ... 
}; 

इस उदाहरण में चर _this enclosing दायरे में घोषित की ओर setDim समारोह से एक बंद अंक (_ensureInit समारोह)। यह चर setDim में घोषित नहीं किया गया है और न ही पारित किया गया है। यह "फ्री वैरिएबल" है।

ध्यान दें कि _this फ़ंक्शन setDim फ़ंक्शन का चर नहीं बनता है: उसी स्कोप में घोषित एक और फ़ंक्शन एक ही चर साझा करेगा।

+0

"इस संदर्भ में, वे केवल वेरिएबल्स हैं जो फ़ंक्शन लेते हैं (पढ़ना और लिखना) संलग्न क्षेत्र में जहां बंद घोषित किया जाता है।" यकीन नहीं है कि आप वहां क्या मतलब था? क्या आप एक उदाहरण के साथ समझा सकते हैं, हो सकता है? – Geek

+0

@ गीक मैंने एक असली दुनिया का उदाहरण जोड़ा –

0

एक उदाहरण के रूप:

var myModule = (function(){ 
    var moduleVar; // closure variable 

    return function(){ 
    // actual function 
    } 
})(); 

चर परिभाषित वहाँ एक बंद चर रहा है। इसका उपयोग पूरे बंद होने पर ही किया जा सकता है लेकिन यह वैश्विक नामस्थान का हिस्सा नहीं है।

0

एक "मुफ़्त-अनुवाद" हो सकता है: "out of scope" - variables

ईसीएमएस्क्रिप्ट लिक्सिकल स्कॉपिंग का उपयोग करता है, इसलिए एक फ्री वैरिएबल एक वेरिएबल होता है जिसे माता-पिता-स्कोप में परिभाषित किया गया था और स्कोप-चेन सर्च द्वारा देखा गया था।

(function _outerScope() { 
    var foo = 42; 

    (function _innerScope() { 
     var bar = 100; 

     console.log(foo + bar); // 142 
    }()); 
}()); 

उपरोक्त उदाहरण में, foo एक मुक्त चर_innerScope के संदर्भ में है। यदि यह ईसीएमएस्क्रिप्ट की अंतर्निहित अवधारणाओं में त्वरित नज़र डाले तो यह बहुत स्पष्ट हो जाता है।

एक प्रसंग एक सक्रियण वस्तु (ES3 में) से जुड़ा हुआ है, क्रमशः एक शाब्दिक पर्यावरण रिकार्ड है, जो तरह बातें शामिल हैं (ES5 में):, साथ ही के लिए एक संदर्भ के रूप में function declarations, variables declared with var और formal paramters सभी अभिभावक सक्रियण ऑब्जेक्ट्स/लेक्सिकल वातावरण। यदि किसी चर को एक्सेस करने की आवश्यकता है, तो ईसीएमएस्क्रिप्ट इंजन पहले एओ/LES वर्तमान संदर्भ से पहले देखेंगे; अगर यह वहां नहीं पाया जा सकता है, तो यह माता-पिता एओ के/LE के रूप में देखता है।

किसी भी के बाद से प्रसंग भंडार एक सरणी की तरह संरचना में इस डेटा (मत भूलना हम कार्यान्वयन के स्तर के बारे में यहाँ बात कर रहे हैं, न स्वयं Javascript), हम Lexical Scope के बारे में, बात कर रहे हैं क्योंकि हम सभी के माध्यम से खोज क्रम में संदर्भ संदर्भ।

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