2013-08-31 12 views
5
for(var i = 0; i < 100; i++){ 
    var foo = 5; 

} 

यह काम करता है ... लेकिन क्या यह बुरा है?कई बार वैरिएबल घोषित करना

मुझे पता है कि मैं बाहर var foo घोषित कर सकता हूं, लेकिन ऐसा क्यों होता है जब मैं इसे लूप में उपयोग करने जा रहा हूं?

+11

वास्तव में, यह केवल एक बार घोषित किया जाता है। सभी परिवर्तनीय घोषणाएं उनके दायरे (कार्य की शुरुआत, या वैश्विक दायरे) के शीर्ष पर फिसल गई हैं। ब्लॉक जावास्क्रिप्ट में गुंजाइश नहीं बनाते हैं। – bfavaretto

+0

@bfavaretto: कम से कम अभी तक नहीं। – elclanrs

+0

भले ही अर्थशास्त्र बीएफएआरएआरटीओ के रूप में कार्य करता है, मैं उपयोग साइट पर "घोषणाओं को बंद रखना" पसंद करता हूं। यह कोड नहीं बदलता है, लेकिन * मुझे लगता है कि यह कोड का इरादा अधिक स्पष्ट करता है और मैं कोड को स्कैन कर सकता हूं यह देखने के लिए कि क्या कुछ संदिग्ध रूप से बाहर दिखता है या नहीं। अन्य असहमत हो सकते हैं, और यह ठीक है। – user2246674

उत्तर

3

समय के साथ मेरी निजी शैली वैरिएबल घोषित करने के लिए एक प्राथमिकता में उभरी है, जहां वे उस विशेष भाषा के "दिमाग" में "वास्तव में" हैं, जिसमें मैं काम कर रहा हूं। जावास्क्रिप्ट के लिए इसका मतलब है पदों में परिवर्तनीय और कार्य घोषणाएं भाषा वैसे भी उन्हें उछाल जाएगा।

यह स्पष्टता, सटीक संचार, समझ, रखरखाव के लिए है, भाषा की प्रक्रियाओं के साथ समानांतर अपनी मानसिक प्रक्रियाओं को रखने के लिए, कुछ अच्छे कारणों का उल्लेख करने के लिए।

तो इस विशेष मामले में, मैं नहीं एक var foo = 5; घोषणा एक for पाश के शरीर में डाल दिया जाएगा, सरल कारण यह है कि यह नहीं कर रहा है कि यह क्या लगता है कि यह कर रहा है, यानी के लिए, यह नहीं तथ्य redeclaring में है/प्रत्येक पुनरावृत्ति के साथ चर को फिर से स्कूपिंग। (var लूप के शीर्षलेख (प्रारंभिक स्थिति; स्थिति; बाद के विचार) के प्रारंभिक भाग में घोषणा अधिक उचित होगी, और निश्चित रूप से उन भाषाओं में रखने के लिए सही जगह होगी जिनमें ब्लॉक-स्तरीय चर होते हैं, जैसे कि जावास्क्रिप्ट ब्लॉक स्तर क्षेत्र के लिए let शैली घोषणा अपनाने खत्म)

नोट्स:।

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

  • मेरे लिए इस अभ्यास का एक अतिरिक्त लाभ यह रहा है कि यह मुझे अपने कार्यों को मॉड्यूलर और आकार में उचित रखने के लिए प्रोत्साहित करता है।

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

पीएस कोई एक मुद्दा ला सकता है कि कुछ कार्य इतने लंबे होते हैं कि इस अभ्यास से परिवर्तनीय घोषणाएं पृष्ठों को समाप्त करती हैं जहां से उनका उपयोग किया जाता है। हां, मैंने कोड देखा है जहां यह सच है, और शायद यहां तक ​​कि कोड भी जहां मदद नहीं की जा सकती है। फिर भी मैं समानांतर को देखने में मदद नहीं कर सकता जो गद्य के लेखकों के लिए समान रूप से सच है क्योंकि यह कंप्यूटर प्रोग्रामर के लिए है। जैसे-जैसे कौशल स्तर बढ़ता है, लेखकों के वाक्यों की लंबाई (और प्रोग्रामर के कार्यों के आकार) बढ़ने लगते हैं, और फिर कौशल स्तर अभी भी बढ़ता जा रहा है, वाक्यों की लंबाई (और प्रोग्रामर के कार्यों के आकार) एक बार कम हो जाते हैं अधिक।

+0

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

3

यह खराब है क्योंकि यह झूठी छाप देता है कि i और foo स्थानीय चर हैं।

for(var i = 0; i < 100; i++){ 
    var foo = 5; 
} 
foo; // 5 

यह सरल कोड के साथ एक समस्या नहीं हो सकता है, लेकिन अगर आप को बंद का उपयोग यह स्पष्ट हो जाता केवल एक foo है कि वहाँ:

var counters = []; 
for (var i = 0; i < 100; i++) { 
    var foo = 5; 
    counters.push(function() { foo++; return foo; }); 
} 
counters[0](); // 6 
counters[0](); // 7 
counters[1](); // 8 (!) 

एक अलग दायरे में foo बनाने के लिए एक समारोह की जरूरत है पेश किया:

var counters = []; 
for (var i = 0; i < 100; i++) { 
    (function() { 
     var foo = 5; 
     counters.push(function() { foo++; return foo; }); 
    })(); 
} 
counters[0](); // 6 
counters[0](); // 7 
counters[1](); // 6 

यहाँ इस की वजह से गलत हो रहा चीजों की एक वास्तविक जीवन उदाहरण है: setTimeout in for-loop does not print consecutive values

जावास्क्रिप्ट से 1.7 आप वास्तविक स्थानीय चर बनाने के लिए let कीवर्ड (MDN देखें) का उपयोग कर सकते हैं।

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