2012-01-04 7 views
8

मैं जावास्क्रिप्ट के लिए नया हूँ, और इस कोड को समझने में समस्या हो रही:गलतफहमी closures

function addProperty(o) { 
    var value; 

    o["get"] = function() { return value; } 
    o["set"] = function(v) { value = v; } 
} 

var a = {}; 
addProperty(a); 
var b = {}; 
addProperty(b); 

a.set(4); 
b.set(5); 
print("a is " + a.get() + "; b is " + b.get()); 

यह प्रिंट (v8/d8 में) a is 4; b is 5। अगर मैं var value; लाइन पर टिप्पणी करता हूं, तो मुझे a is 5; b is 5 मिलता है। 'मूल्य' वस्तु कहां है, और उनमें से दो क्यों हैं? धन्यवाद।

+0

मुझे समझ में नहीं आता है कि "क्यों हैं उनमें से दो "प्रश्न का हिस्सा हैं। कृपया क्या आप स्पष्टीकरण दे सकते हैं? – slinzerthegod

+0

ऑब्जेक्ट 'ए' के ​​साथ एक मूल्य है, जिसमें पूर्णांक '4' होता है, और ऑब्जेक्ट 'बी' के साथ एक मूल्य होता है, जिसमें पूर्णांक '5' होता है। – EML

उत्तर

12

value परिवर्तनीय addProperty पर स्थानीय है। पहली बार addProperty कहा जाता है, एक नया value बनाया गया है, जिस पर दोनों कार्य बंद हैं। दूसरी बार addProperty कहा जाता है, दूसरा value बनाया गया है जिस पर दो नए कार्य बंद हैं।

var निकालना एक वैश्विकwindow उद्देश्य यह है कि सभी कार्यों के द्वारा साझा किया जाता पर value पैदा करता है।

शायद तुम यह करने के लिए मतलब है:

function createPropertyMgr() { 
    var value; 
    return function(o) { 
     o["get"] = function() { return value; } 
     o["set"] = function(v) { value = v; } 
    } 
} 

var addProperty = createPropertyMgr(); 

इस नए addProperty समारोह बंद कर देता है value से अधिक कोई बात नहीं यह कितनी बार कहा जाता है। मुझे यकीन नहीं है कि मैं उपयोग के मामले को समझता हूं, लेकिन इसमें अंतर दिखाना चाहिए।

+4

+1 * स्रोत * में एक 'मान' है, लेकिन दो * स्मृति * में है। यह ओपी का भ्रम प्रतीत होता है। – pimvdb

+0

तो, यह प्रत्येक addProperty कॉल पर मूल्य var की एक प्रति बनाता है। लेकिन, तर्क वस्तु को कैसे बांधता है? –

+1

@TomasNarros: वही तरीका। औपचारिक पैरामीटर, फ़ंक्शन घोषणाएं और 'var' के साथ घोषित चर' सक्रियण ऑब्जेक्ट 'का हिस्सा हैं और यह है, जिसे एक व्याख्यात्मक बंद करने के लिए कॉपी किया गया है। – jAndy

1

जब आप किसी फ़ंक्शन के अंदर स्पष्ट रूप से एक चर घोषित नहीं करते हैं, तो इसका दायरा वैश्विक मान लिया जाता है। यानी आपके दूसरे मामले में, चूंकि आपने value को addProperty() फ़ंक्शन के लिए स्पष्ट रूप से घोषित नहीं किया है, इसलिए इसे वैश्विक माना जाता है।

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

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