2012-02-14 40 views
7

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

  1. स्थानीय और निजी चर के बीच क्या अंतर है? क्या कोई है?

  2. कोई वैरिएबल ग्लोबल या स्थानीय कैसे बनाता है, उन्होंने इससे पहले 'var =' डालने के बारे में कुछ कहा, लेकिन यह बहुत अस्पष्ट था।

+0

आप http://stackoverflow.com/questions/500431/javascript-variable-scope –

उत्तर

8
  1. कोई नहीं, लोगों को "निजी" का उपयोग करते हैं क्योंकि वे गलत कर रहे हैं और कहने के लिए "स्थानीय"

  2. स्थानीय चर के रूप

var foo = "local";

परिभाषित कर रहे हैं होती हैं

वैश्विक चर वैश्विक दायरे वस्तु का एक गुण हैं (जोहैब्राउज़र में)

window.foo = "global";

सच है कि आप पहले var foo साथ चर foo बताए foo = "global"; कर सकते हैं एक "बग" है। यह ES5 सख्त मोड में तय किया गया है।

(function() { "use strict"; foo = 42; })()

देता ReferenceError: foo is not defined

नोट है कि आप उन्हें सबसे बाहरी दायरे में घोषणा करके चर वैश्विक कर सकते हैं

var foo = "global"; 
function bar() { 
    var foo = "local"; 
} 

यह ध्यान देने योग्य है कि आप बाहरी में किसी भी कोड नहीं होना चाहिए सबसे अधिक गुंजाइश, कभी। आपको अपने सभी गुंजाइश को अज्ञात कार्यों में लपेटना चाहिए ताकि आपको "मॉड्यूल स्तर का दायरा" मिल सके। इसका मतलब है कि आपके पास प्रति फ़ाइल आधारित शीर्ष स्तरीय दायरा है। यह मॉड्यूल पैटर्न का हिस्सा है।

4

ब्राउज़र के संदर्भ में, विविध कीवर्ड चर के वर्तमान कार्य के चर को स्कॉप्स करता है।

var a = 10; 

var b = function(a) { 
    console.log(a); # 15 
} 

b(15); 
console.log(a); # 10 

यदि आप var कीवर्ड शामिल नहीं करते हैं, तो इसे विंडो का दायरा सौंपा गया है और इसे वैश्विक माना जाता है। जब तक कि इसे बाहर करने का कोई अच्छा कारण न हो, हमेशा भिन्न कीवर्ड शामिल करें।

एक चर को निजी माना जाता है यदि यह केवल फ़ंक्शन स्कोप के अंदर मौजूद है। यह आमतौर पर एक अज्ञात फ़ंक्शन का रूप लेता है। यह वास्तव में शब्द की सामान्य समझ में एक निजी चर नहीं है, यह केवल एक स्थानीय चर है।

(function() { 
    var x = 10; 
})(); 

console.log(x); #undefined 
+0

पर एक नज़र रखना चाहते हैं निजी की आपकी परिभाषा खराब है। चर कभी निजी नहीं होते हैं। – Raynos

+1

@ रेयोनोस 'यह वास्तव में शब्द की सामान्य समझ में एक निजी चर नहीं है, यह केवल एक स्थानीय चर है। – Gazler

+0

.. या कॉफीस्क्रिप्ट का उपयोग करें :-) –

0

स्थानीय और निजी चर के बीच क्या अंतर है? क्या एक है?

निर्भर करता है कि वे किस संदर्भ में उपयोग किए जाते हैं। आम तौर पर वे एक ही बात का मतलब है। ओओपी परिप्रेक्ष्य से, स्थानीय चर को आमतौर पर निजी कहा जाता है।

कोई वैरिएबल ग्लोबल या स्थानीय कैसे बनाता है, उन्होंने कुछ से पहले 'var =' डालने के बारे में कुछ कहा, लेकिन यह बहुत अस्पष्ट था।

जब आप चर से पहले var डालते हैं, तो यह अनुपस्थिति में स्थानीय चर बन जाता है, हालांकि यह वैश्विक चर बन जाता है।

var foo = 1; // local 
foo = 1; // global equivalent to window.foo = 1 becomes part of window object 

अधिक व्यावहारिक उदाहरण: उदाहरण के लिए:

function myfunc(){ 
    var foo = 1; // presence of var keyword 
    bar = 2;  // absence of var keyword 
} 

alert(foo); // error eg undefined 
alert(bar); // 2 because bar is part of window global object 
0

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

function test(){ 
    var local = 'local'; // this is local 
    global = 'global'; // this is global 
} 

test(); // call a function 

alert(local) // undefined 
alert(global) // global 
+0

'अलर्ट (स्थानीय); 'एक संदर्भ त्रुटि फेंकता है – Raynos

0

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