2011-11-23 7 views
5

पहले से बेहतर दूसरा है?क्या लूप के बाहर वर्रों को परिभाषित करना बेहतर है?

सबसे पहले:

var count:int=myArray.length; 
for(var i:uint=0;i<count;i++) 
{ 
    var str:String=myArray[i].label; 
    var somethingElse:Class=...; 
    var andAnotherThing:MyInstance=new MyInstance(somethingElse); 
    ... 
} 

दूसरा:

var count:int=myArray.length; 
var str:String; 
var somethingElse:Class; 
var andAnotherThing:MyInstance; 
for(var i:uint=0;i<count;i++) 
{ 
    str=myArray[i].label; 
    somethingElse=...; 
    andAnotherThing=new MyInstance(somethingElse); 
    ... 
} 

धन्यवाद।

+2

+1 ग्रेट सवाल .. जैसा कि मैंने शुरू में सोचा था कि यह स्पष्ट था, लेकिन जल्दी से अन्य उत्तरों के माध्यम से महसूस किया है कि यह स्पष्ट – Chris

उत्तर

7

एक्शनस्क्रिप्ट और जावास्क्रिप्ट में, चर को फ़ंक्शन पर स्कॉप्ड किया जाता है, ब्लॉक नहीं। इसे परिवर्तनीय hoisting कहा जाता है।

ActionScript 3.0 Variables

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

तो प्रभावी रूप से अपने कोड इस तरह की परवाह किए बिना व्यवहार करेंगे जहां समारोह के भीतर अपने चर घोषित:

var count:int; 
var str:String; 
var i:uint; 
var somethingElse:Class; 
var andAnotherThing:MyInstance; 

count = myArray.length; 
for(i=0;i<count;i++) 
{ 
    str=myArray[i].label; 
    somethingElse = ...; 
    andAnotherThing = new MyInstance(somethingElse); 
    ... 
} 

फिर भी, मैं अभी भी पसंद करते हैं ब्लॉकों है कि उन्हें रखरखाव के लिए मुख्य रूप से उपयोग करने के भीतर मेरी चर घोषित करने के लिए कारण और सामान्य स्पष्टता।

+0

आह, इसलिए उन्हें प्रत्येक पाश पर फिर से घोषित नहीं किया गया है, है ना? – Francisc

+1

@ फ्रांसिस्को नोप, वे नहीं हैं, आप लूप के प्रत्येक पुनरावृत्ति के लिए एक ही चर सेट कर रहे हैं। आप इसे डीबगर में सत्यापित कर सकते हैं, आप देखेंगे कि चर में प्रत्येक पुनरावृत्ति की शुरुआत में पिछले मान होंगे। – Peter

+0

ग्रेट, फिर से धन्यवाद। – Francisc

2

फ़्लैश पर, जवाब यह कोई फर्क नहीं पड़ता। परिवर्तनीय घोषणा की बात आती है जब फ्लैश अजीब है। निम्नलिखित करो और देखो क्या होता है:

for(var i:uint=0;i<count;i++) 
{ 
    var str:String=myArray[i].label; 
    var somethingElse:Class=...; 
    var andAnotherThing:MyInstance=new MyInstance(somethingElse); 
} 
var str:String=myArray[i].label; 

हालांकि str पाश के लिए से बाहर क्षेत्र से बाहर भाग गया, आप एक चर परिभाषा चेतावनी मिल जाएगा, जिसका अर्थ है कि चर केवल "प्रारंभ" हो जाएगा एक बार एक में पाश के लिए;

+0

से बहुत दूर है, धन्यवाद, फेलिप। – Francisc

1

एक्शनस्क्रिप्ट 3 में मुझे नहीं लगता कि यह वास्तव में मायने रखता है। मैं अन्य भाषाओं में विश्वास करता हूं, लूप का अपना गुंजाइश है जिसका मतलब है कि उनके भीतर परिभाषित चर लूप के बाहर पहुंच योग्य नहीं हैं।

मुझे लगता है कि एएस 3 में एकमात्र अंतर यह है कि यह पठनीयता को कैसे प्रभावित करता है। मेरी राय में, पहला उदाहरण बहुत अच्छा है।

पहले मैं अक्सर पठनीयता प्रयोजनों के लिए पाश ऊपर इटरेटर परिभाषित, इस तरह:

var i:MovieClip; 
for each(i in movieClipArray) 
{ 
    trace(i); 
} 

लेकिन विभिन्न प्रकार की भाषाओं में हो रही के बाद से, मैं सब कुछ रखा है स्थिरता के लिए निहित:

for each(var i:MovieClip in movieClipArray) 
{ 
    trace(i); 
} 
+0

धन्यवाद, मार्टी। – Francisc

2

एक्शनस्क्रिप्ट कुछ अन्य भाषाओं के विपरीत निष्पादन ब्लॉक (for ब्लॉक) को अपने स्वयं के दायरे नहीं देता है। चर के लिए सबसे छोटा गुंजाइश एक समारोह है। तो कंपाइलर के लिए, उन दोनों उदाहरण एक ही हैं। वास्तव में, कार्यान्वयन "वेरिएबल होस्टिंग" नामक एक तकनीक है, जहां कंपाइलर स्कोप की शुरुआत से पहले चर की घोषणा को स्थानांतरित करता है।

यह कुछ दिलचस्प है, अगर अप्रत्याशित, दुष्प्रभाव; आप "घोषित" होने से पहले एक चर को प्रभावी ढंग से "उपयोग" कर सकते हैं। उदाहरण के लिए:

trace(test); // NaN 
var test:Number = 10; 
trace(test); // 10 

ध्यान दें कि पहला निशान विफल नहीं होता है।

वैसे भी, याद रखने की मुख्य बात यह है कि चर स्थानीय रूप से कार्यों के लिए स्कॉप्ड किए जाते हैं। बंद होने से निपटने पर यह विशेष रूप से महत्वपूर्ण है।

+0

अच्छी अंतर्दृष्टि, धन्यवाद 32-बिट बच्चा। – Francisc