2009-12-08 10 views
6

मैं जावास्क्रिप्ट के लिए नया हूँ।जावास्क्रिप्ट चर को फिर से चलाने का कोई उद्देश्य है?

<html> 
<body> 
<script type="text/javascript"> 
var x=5; 
document.write(x); 
document.write("<br />"); 
var x; 
document.write(x); 
</script> 
</body> 
</html> 

परिणाम है:

5 
5 

जब x दूसरी बार यह अपरिभाषित किया जाना चाहिए घोषित किया जाता है, लेकिन यह पिछले मान रहता है। कृपया बताएं कि क्या इस पुनर्विक्रय के पास कोई विशेष उद्देश्य है।

+0

आपके प्रश्न की सामग्री एक विशिष्ट उदाहरण है, जिसका उत्तर नीचे दिया गया है। हालांकि, मैंने पाया कि [यह जवाब] (http://stackoverflow.com/a/12889928/983430) एक समान प्रश्न के लिए जेनेरिक केस का जवाब देता है (जब/जावास्क्रिप्ट चर को फिर से चलाने का उपयोग क्यों किया जाएगा?) के शीर्षक में पूछा गया आपका सवाल वास्तव में अच्छा है। –

उत्तर

20

आप वास्तव में चर को फिर से घोषित नहीं कर रहे हैं।

जावास्क्रिप्ट में चर बयान, इसका मतलब है कि वे क्रम कार्य किया जाता है में पार्स समय और बाद में मूल्यांकन किया जाता है, उत्थापन के अधीन है।

<script> 
var x= 'this is global x'; 
function my_x() { 
var x= 'localized x'; 
alert(x); 
} 
my_x(); 
alert(x); 
</script> 
+0

धन्यवाद अब मैं – Warrior

0

जहां तक ​​जावास्क्रिप्ट की मेरी समझ जाती है, var कीवर्ड का उपयोग वैश्विक दायरे में पूरी तरह से वैकल्पिक है। यह कार्यों के लिए एक अलग कहानी है।

किसी फ़ंक्शन के अंदर, var कीवर्ड का उपयोग यह इंगित करने के लिए करें कि चर फ़ंक्शन के लिए स्थानीय है (डिफ़ॉल्ट रूप से वैश्विक होने के विपरीत)।

वैश्विक स्तर पर मैं व्यक्तिगत रूप से var का उपयोग करता हूं ताकि यह दिखाया जा सके कि एक चर को घोषित किया जा रहा है और/या पहली बार उपयोग किया जा रहा है।

अधिक जानकारी के लिए आप http://www.w3schools.com/js/js_variables.asp का संदर्भ दे सकते हैं।

+2

नहीं यह नहीं है: 'var' निर्दिष्ट किए बिना, एक चर वैश्विक स्तर पर गिर जाएगा। – jldupont

+0

var फ़ंक्शन के भीतर स्कोप के लिए उपयोग किया जाता है, यदि आप var का उपयोग नहीं करते हैं तो यह स्वचालित रूप से वैश्विक है। –

+0

हे - सभी एक ही 20 सेकंड के भीतर। –

1

इसलिए जब दूसरी बार है जब इसकी घोषणा की एक्स अपरिभाषित किया जाना चाहिए

विनिर्देश के किस हिस्से इस कहते हैं?

"अपरिभाषित व्यवहार" का अर्थ यह नहीं है कि "चर undefined होगा"।

0

वह दूसरा var x पूरी तरह से अनिवार्य है।

0

के भीतर एक ही दायरा, यह एक चर "redeclare" के लिए पूरी तरह से अनावश्यक है।

0

इसके अलावा, एक प्रोग्रामर var उपयोग करने के लिए एक चर स्थानीय बनाना चाहते हो सकता है:

पार्स चरण के अंत में आपका कोड, क्रियान्वयन से पहले इस तरह दिखता है आपको कभी एक वैरिएबल को एक ही दायरे में पुन: प्राप्त करना चाहिए, अगर आप वास्तव में इसे बदलना चाहते हैं तो उसे असाइन करें।

x = "hello"; 

यह आवश्यक नहीं है तो आप उसे वापस अपरिभाषित करने के लिए सेट या पहले redeclare कि: पुन: घोषणा करता है, तो आप एक्स एक स्ट्रिंग सिर्फ आवंटित होना चाहता हूँ इस गतिशील भाषा में एक अलग वस्तु बनाने के लिए आवश्यक नहीं है,।

कृपया ध्यान दें कि परिवर्तनीय प्रकार को बदलना ज्यादातर स्थितियों में बहुत अच्छा अभ्यास नहीं है, बस यह बताते हुए कि यह एक संभावना है यदि आपको इसकी आवश्यकता है।

+0

साफ़ कर रहा हूं हालांकि यह संभव है और इसका एक बहुत अच्छा विवरण है, मुझे यकीन नहीं है कि यह एक बहुत अच्छा अभ्यास है, परिवर्तनीय नामों को आम तौर पर अलग-अलग नहीं किया जाना चाहिए का उपयोग करता है। – Jay

0

:

var x; 
x = 5; 

document.write(x); 
document.write("<br />"); 
document.write(x); 
7

var अकेले असाइनमेंट नहीं करता है। यह केवल ध्वजांकित करता है कि जब आप var पर पूरे चर के चर नाम का उपयोग करते हैं, तो आप स्थानीय चर के बारे में बात कर रहे हैं, न कि वैश्विक (विवादास्पद डिफ़ॉल्ट)। जब समारोह पार्स और उस दायरे में रखती है var देखा जाता है, इसलिए जहां डाल यह अप्रासंगिक है:

global a= 0, local a= 1 में
var a= 0; 

function foo() { 
    a= 1; 
    return a; 
    var a; 
} 

var b= foo(); 
alert('global a='+a+', local a='+b); 

परिणाम: भले ही var बयान foo() के निष्पादन के पाठ्यक्रम में कभी नहीं किया जाता है, यह a स्थानीय चर बनाने में अभी भी प्रभावी है।

तो var x एक ही दायरे में दूसरी बार घोषित करना पूरी तरह से अनावश्यक है। हालांकि आप कभी-कभी ऐसा कर सकते हैं, आमतौर पर जब आप एक ही फ़ंक्शन के भीतर दूसरे स्वतंत्र उपयोग के लिए स्थानीय चर नाम का पुन: उपयोग करते हैं। सबसे अधिक:

for (var i= 0; i<onething.length; i++) { 
    ...do some trivial loop... 
} 

for (var i= 0; i<anotherthing.length; i++) { 
    ...do another trivial loop... 
} 

जबकि आप निश्चित रूप से दूसरे var, और उपकरणों jslint तरह की मांग करेंगे आप ऐसा करते हैं छोड़ सकता है, यह वास्तव में एक अच्छा विचार हो नहीं सकता है।

कल्पना करें कि बाद में आप पहले लूप को बदल या हटा दें ताकि यह i को var घोषित न करे। अब शेष दूसरा पाश अचानक स्थानीय से वैश्विक चर में अर्थ बदलता है। यदि आप पहली लूप को अपडेट करते समय नोटिस करने में विफल रहते हैं कि दूसरी लूप पर उस पर एक छिपी निर्भरता है (और आप यह भी ध्यान में रखते हुए असफल हो सकते हैं कि आंखें पैटर्न को for(...=0 ; ...<...; ...++) में "ओह, यह सिर्फ एक मानक इटरेटर" है, आपको एक सूक्ष्म और कष्टप्रद-से-डीबग समस्या मिली है।

0

मैं हाल ही में की तरह कोड लिखा है:

var obj1 = get_an_object(); 
var v = obj1.get_velocity(); 
v += changes_in_velocity(); 
obj1.set_velocity(v); 

var obj2 = get_an_object(); 
var v = obj2.get_velocity(); 
v += changes_in_velocity(); 
obj2.set_velocity(v); 

जहां तक ​​ब्राउज़र का संबंध है, दूसरा var v बयान निरर्थक और व्यर्थ था (वास्तविक कोड और अधिक जटिल और कम दोहराव था)। मेरे लिए, यह दो उद्देश्यों की सेवा की। यह सब कुछ भूल गया जो मुझे पुराने v के बारे में पता था, क्योंकि यह एक नया उपयोग था। और इसका मतलब था कि मैं कोड को फिर से ऑर्डर कर सकता हूं, या चीजों को तोड़ने के बिना पहली छमाही पर टिप्पणी कर सकता हूं।

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

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