2009-06-06 10 views
23

या मुझे जो चाहिए वह अधिक विशिष्ट:जावास्क्रिप्ट में स्थिर या गतिशील रूप से "scoped" चर हैं?

यदि मैं किसी अन्य फ़ंक्शन के भीतर से कोई फ़ंक्शन कॉल करता हूं, तो क्या यह चर को कॉलिंग फ़ंक्शन के भीतर या ऊपर के स्तर से खींचने जा रहा है? उदाहरण के लिए:

myVar=0; 

function runMe(){ 
    myVar = 10; 
    callMe(); 
} 

function callMe(){ 
    addMe = myVar+10; 
} 

क्या myVar अंत अगर callme() runMe के माध्यम से कहा जाता है किया जा रहा है()?

+11

आप इसे क्यों नहीं चलाते और पता लगाते हैं? –

+0

क्या सवाल को दस्तावेज करना बेहतर नहीं है ताकि अन्य इसे भी देख सकें? – affinehat

उत्तर

39

जेफ सही है। ध्यान दें कि यह वास्तव में स्थैतिक स्कोपिंग का एक अच्छा परीक्षण नहीं है (जो जेएस है)। एक बेहतर एक होगा:

myVar=0; 

function runMe(){ 
    var myVar = 10; 
    callMe(); 
} 

function callMe(){ 
    addMe = myVar+10; 
} 

runMe(); 
alert(addMe); 
alert(myVar); 

एक स्थिर scoped भाषा (जे एस) की तरह है कि 10 अलर्ट में, और 0. वर myVar (स्थानीय चर) runMe में है कि समारोह में वैश्विक myVar छाया। हालांकि, यह, callme में कोई प्रभाव नहीं है तो callme वैश्विक myVar जो 0.

पर अब भी है एक गतिशील scoped भाषा ( विपरीत जे एस) में उपयोग करता है, callme, runMe से दायरे के वारिस तो AddMe 20 बन जाएगा। ध्यान दें कि MyVar अभी भी अलर्ट पर 0 होगा, क्योंकि अलर्ट किसी भी फ़ंक्शन से गुंजाइश का वारिस नहीं करता है।

+9

अपवाद 'यह' कीवर्ड है जो एक गतिशील रूप से स्कॉप्ड वैरिएबल की तरह व्यवहार करता है – Jaksa

3

यदि आपकी अगली पंक्ति callMe() है;, तो addMe 10 होगा, और MyVar 0.

यदि आपकी अगली पंक्ति runMe() है;, तो addMe 20 होगा, और MyVar 10 होगा।

मुझे पूछने के लिए क्षमा करें - इसे स्थिर/गतिशील बाध्यकारी के साथ क्या करना है? MyVar बस एक वैश्विक चर नहीं है, और प्रक्रियात्मक कोड नहीं होगा (कॉल स्टैक पर सबकुछ अनचाहे) मूल्य निर्धारित करते हैं?

+0

मेरा मतलब था स्कोपिंग ... – kylex

2

वैरिएबल को जावास्क्रिप्ट में स्थिर रूप से स्कॉप्ड किया गया है (गतिशील स्कॉइंग वास्तव में एक सुंदर गन्दा व्यवसाय है: आप Wikipedia पर इसके बारे में अधिक पढ़ सकते हैं)।

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

This Page जावास्क्रिप्ट में वैश्विक बनाम स्थानीय चर घोषित करने का तरीका बताता है, यदि आप इससे परिचित नहीं हैं। यह अधिकांश स्क्रिप्टिंग भाषाओं के तरीके से अलग है। (संक्षेप में: "var" कीवर्ड अगर एक समारोह के अंदर घोषित एक चर स्थानीय बनाता है, अन्यथा चर वैश्विक है।)

0

जहां तक ​​मैं समझता हूँ, वर कीवर्ड के बिना किसी भी चर वैश्विक व्यवहार किया जाता है, इसके साथ, अपने स्थानीय स्कोप है, तो:

// This is a local scoped variable. 
var local_var = "something"; 

// This is a global scoped variable. 
global_var = "something_else"; 

एक अच्छा जे एस अभ्यास के रूप में, यह हमेशा वर कीवर्ड जोड़ने के लिए सिफारिश की है।

1

जब तक आप अपने चर को परिभाषित करने के लिए कीवर्ड var का उपयोग नहीं करते हैं, तो सब कुछ window ऑब्जेक्ट पर एक संपत्ति होने के समाप्त होता है।तो अपने कोड निम्नलिखित के बराबर होगा:

window.myVar=0; 

function runMe(){ 
    window.myVar = 10; 
    window.callMe(); 
} 

function callMe(){ 
    window.addMe = window.myVar+10; 
} 

आप ध्यान में रखना है, यह हमेशा स्पष्ट क्या हो रहा है होना चाहिए।

0

मैं यह जोड़ना चाहता हूं कि लैम्ब्डा अभिव्यक्तियों को उस स्थान पर भी स्थाई रूप से स्कॉप्ड किया गया है जो अभिव्यक्ति परिभाषित किया गया है। उदाहरण के लिए,

var myVar = 0; 

function foo() { 
    var myVar = 10; 
    return { bar: function() { addMe = myVar + 10; }} 
} 

var myObj = foo(); 

var addMe = 6; 
alert(addMe); 

myVar = 42; 
myObj.bar(); 

alert(addMe); 

यह प्रदर्शित करेगा 6 और 20.

0
myVar=0; 

function runMe(){ 
    myVar = 10; 
    callMe(); 
} 

function callMe(){ 
    addMe = myVar+10; 
} 

जहां तक ​​उत्पादन myVar का संबंध है और दोनों AddMe इस मामले में वैश्विक चर हो जाएगा, जावास्क्रिप्ट में के रूप में यदि आप डॉन ' टी var के साथ एक वैरिएबल घोषित करता है तो यह पूरी तरह से इसे वैश्विक के रूप में घोषित करता है इसलिए जब आप runMe() को कॉल करते हैं तो myVar का मान 10 होगा और addMe में 20 होगा।

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