2011-11-23 26 views
5

Thứ hai tốt hơn lần đầu tiên?Tốt hơn là xác định các vars bên ngoài vòng lặp?

FIRST:

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); 
    ... 
} 

THỨ HAI:

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); 
    ... 
} 

Cảm ơn bạn.

+2

+1 Câu hỏi tuyệt vời .. như ban đầu tôi nghĩ điều này là hiển nhiên, nhưng đã nhanh chóng nhận ra qua các câu trả lời khác rằng nó là xa rõ ràng – Chris

Trả lời

7

Trong Actionscript và Javascript, các biến được phạm vi cho hàm, không phải là khối. Nó được gọi là cẩu nâng.

ActionScript 3.0 Variables

Một hàm ý thú vị của việc thiếu phạm vi khối cấp là bạn có thể đọc hoặc viết thư cho một biến trước khi nó được công bố, chừng nào nó được khai báo trước khi chức năng kết thúc. Điều này là do một kỹ thuật được gọi là cẩu, có nghĩa là trình biên dịch di chuyển tất cả các khai báo biến đến đầu của hàm.

Vì vậy, hiệu quả mã của bạn sẽ cư xử như thế này không phân biệt nơi bạn khai báo các biến của bạn trong phạm vi chức năng:

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); 
    ... 
} 

Tuy nhiên, tôi vẫn thích để khai báo các biến của tôi trong khối sử dụng chúng chủ yếu để bảo trì lý do và sự rõ ràng chung.

+0

Ah, vì vậy chúng không được khai báo lại trên mỗi vòng lặp, phải không? – Francisc

+1

@Francisc Không, chúng không có, bạn đang thiết lập cùng một biến cho mỗi lần lặp của vòng lặp. Bạn có thể xác minh điều này trong trình gỡ rối, bạn sẽ thấy rằng các biến sẽ chứa các giá trị trước đó ở đầu mỗi lần lặp. – Peter

+0

Tuyệt vời, cảm ơn một lần nữa. – Francisc

2

Trên Flash, câu trả lời là không quan trọng. Flash là lạ khi nói đến khai báo biến. Làm như sau và xem những gì sẽ xảy ra:

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; 

Mặc dù str chạy ra khỏi phạm vi ra khỏi vòng lặp for, bạn sẽ nhận được một cảnh báo định nghĩa lại biến, có nghĩa là biến sẽ chỉ được "khởi tạo" một lần trong một cho vòng lặp;

+0

Cảm ơn bạn, Felipe. – Francisc

1

Trong ActionScript 3 Tôi không nghĩ rằng nó thực sự quan trọng. Tôi tin vào các ngôn ngữ khác, các vòng lặp có phạm vi riêng của chúng có nghĩa là các biến được định nghĩa bên trong chúng không thể truy cập được bên ngoài vòng lặp.

Tôi nghĩ sự khác biệt duy nhất trong AS3 là cách nó ảnh hưởng đến khả năng đọc. Theo tôi, ví dụ đầu tiên đẹp hơn nhiều.

Trước đây tôi thường xác định iterator trên vòng lặp cho các mục đích dễ đọc, như thế này:

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

Nhưng kể từ khi đi vào nhiều ngôn ngữ, tôi đã giữ tất cả mọi thứ chứa cho nhất quán:

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

Cảm ơn bạn, Marty. – Francisc

2

ActionScript không cung cấp khối thực thi (như khối for) phạm vi của riêng chúng, không giống như một số ngôn ngữ khác. Phạm vi nhỏ nhất cho biến là một hàm. Vì vậy, với trình biên dịch, cả hai ví dụ đều giống nhau. Trong thực tế, việc thực hiện là một kỹ thuật được gọi là "hoán đổi biến", nơi trình biên dịch di chuyển khai báo biến trước khi bắt đầu phạm vi.

Điều này có một số tác dụng phụ thú vị, nếu không mong muốn; bạn có thể "sử dụng" một biến hiệu quả trước khi nó được "khai báo". Ví dụ:

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

Lưu ý rằng dấu vết đầu tiên không thành công.

Dù sao, điều quan trọng cần nhớ là các biến được định vị cục bộ theo chức năng. Điều này đặc biệt quan trọng khi đối phó với việc đóng cửa.

+0

Thông tin chi tiết tốt, cảm ơn bé 32 bit. – Francisc

Các vấn đề liên quan