2012-08-14 20 views
5

अंदर मेरे अंतिम प्रश्न के बाद, यह एक और अधिक सटीक मेरे लिए है:"var" चर, "इस" चर और "वैश्विक" चर - एक JavaScript निर्माता

उदाहरण:

function Foo() { 
    this.bla = 1; 
    var blabla = 10; 
    blablabla = 100; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 
foo = new Foo(); 

क्या मैं अब समझें:

this.bla = 1;  // will become an attribute of every instance of FOO. 
var blabla = 10; // will become a local variable of Foo(will **not** become an attribute of every instance of FOO), which could be accessed by any instance of FOO - only if there's a method like "this.getBlabla". that's a "closer" ? 
blablabla = 100; // will define a **new** (or change if exist) global(window) variable. 

क्या मैं सही ढंग से समझता हूं?

इसके अलावा - अगर मैं var blabla = 10; और getblabla फ़ंक्शन जो ठेकेदार में इसका उपयोग करता है, तो Foo ("foo" ...) के प्रत्येक उदाहरण के लिए, स्मृति में एक Foo ठेकेदार फ़ंक्शन सहेजा जाएगा जिसमें यह शामिल है "निजी" चर। या निजी चर के लिए यह वही फू फ़ंक्शन होगा - के लिए सभी उदाहरण (जैसे "foo") foo?

+0

आपके पहले तीन दावे सही हैं। मैं पूरी तरह से पालन नहीं करता कि आप अपने अंतिम प्रश्न के लिए क्या पूछ रहे हैं। क्या आप स्पष्ट कर सकते हो?क्या आप वैरिएबल का भी प्रयास नहीं कर सकते हैं? पालन ​​करना मुश्किल है। धन्यवाद। – Brad

+0

यह मेरे लिए भी जटिल है। मेरा मतलब है - एक बंद है, है ना? और यह एक ठेकेदार है - इसलिए, फू के हर उदाहरण के लिए, स्मृति में फू का नया बंद होना होगा? यह सामान कैसे काम करता है? धन्यवाद। – Daniel

उत्तर

6

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

var x = "Global scope"; 
var y = "Not changed."; 

function Foo() { 
    this.x = "Attribute of foo"; 
    var x = "In foo's closure"; 
    y = "Changed!" 
    this.getX = function() { 
     return x; 
    } 
} 

// do some logging 

console.log(x); // "Global scope" 
console.log(y); // "Not changed" 
foo = new Foo(); 
console.log(y); // "Changed!" 
console.log(foo.x); // "Attribute of foo" 
console.log(x); // "Global scope" 
console.log(foo.getX()); // "In foo's closure" 

लाइन: this.xthis.bla के बराबर है, और यह एक Foo वस्तु का एक बाह्य उपलब्ध विशेषता परिभाषित करता है। yblablabla=100 के बराबर है और फिर foo के भीतर x foo के भीतर आपके blablabla के बराबर है। यहां वास्तव में एक मोटा jsfiddle है जिसे आप इसे देखने के लिए चला सकते हैं।

1

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

यह क्रॉकफ़ोर्ड द्वारा tremendous good video है, जो इसे वास्तव में अच्छी तरह से समझाता है।

2

जो कुछ भी आपने कहा है वह सही है। (बेशक, एक त्रुटि Strict Mode में blablabla काम पर फेंके जाएगा।

दूसरी छमाही पर, निर्माता समारोह के बारे में कुछ खास नहीं है। में है कि यह एक बंद कि जब तक बनी रहती है बनाता है यह सिर्फ किसी भी अन्य समारोह की तरह काम करता । दूसरे पर

function initBlaBla() { 
    var blabla = 10; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 

function Foo() { 
    this.bla = 1; 
    blablabla = 100; 
    initBlaBla.call(this); 
} 

foo = new Foo(); 

यहाँ, Foo निर्माता को बंद करने के लिए फार्म नहीं करता है और इसके दायरे तुरंत जारी किया जाता है initBlaBla: इसके संदर्भित (इस मामले में this.getblabla के जीवनकाल) के रूप में

इस उदाहरण लें। हान डी एक बंद बनाता है। दिलचस्प बात यह है कि कंपाइलर देख सकता है कि ब्लैबला कभी भी 1012 लौटने के लिए this.getblabla को अनुकूलित और अनुकूलित नहीं करता है और कभी भी क्लोजर स्कोप को सहेजता नहीं है। यह तब देखा जा सकता है जब आप बंद करने के अंदर किसी फ़ंक्शन में निष्पादन को तोड़ते हैं और उस मान को पढ़ने का प्रयास करते हैं जो आंतरिक रूप से संदर्भित नहीं होता है।

बंद गुंजाइश जारी किया है और कचरा संग्रहण के लिए कतारबद्ध यदि आप निम्न में से किसी को फोन कर दिया जाएगा:

delete foo.getblabla; 
foo.getblabla = "Anything!"; 
foo = "Anything else."; 
संबंधित मुद्दे