2011-08-12 15 views
11

lấy cảm hứng từ câu hỏi int a[] = {1,2,}; Weird comma allowed. Any particular reason? Tôi nhớ một câu hỏi liên quan đến cú pháp trong ActionScript của Adobe.Actionscript: Tại sao có thể gán một biến trước khi nó được khai báo?

Đối với một số lý do có thể (ít nhất là trong Flex 3) để gán giá trị cho một biến trước khi nó được công bố:

public function foo() : void { 
     a = 3; 
     var a : int = 0; 
} 

Điều này có ý nghĩa gì ..? Đây có phải là lỗi trong trình biên dịch Adobe FlexBuilder không? Hay điều này là do một số di sản cho các phiên bản ECMascript cũ hơn?

Trả lời

17

Một ý nghĩa thú vị của việc thiếu phạm vi cấp khối là bạn có thể đọc hoặc ghi vào một biến trước khi nó được khai báo, miễn là nó được khai báo trước khi hàm 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 lên trên cùng của hàm. Ví dụ, đoạn mã sau biên dịch mặc dù dấu vết ban đầu() chức năng cho biến num xảy ra trước khi biến num được khai báo ...

Actionscript 3.0 Docs - Variables (quote tìm thấy khoảng 2/3 xuống trang)

+0

+1. rất thú vị. tôi không biết về điều này. – TheDarkIn1978

+0

Cảm ơn sự giúp đỡ – paqogomez

3

Theo tôi biết, đó là tính năng của Máy ảo Flash khai báo (cấp phát bộ nhớ, v.v.) tất cả các biến của hàm trước khi thực thi nội dung của hàm. Vì vậy, khai báo biến ở đâu đó trong khối chức năng trong mã ActionScript chỉ báo cáo trình biên dịch để khai báo biến và nó khai báo ở đầu khối chức năng khi chạy. Đó là lý do tại sao mã của bạn giống như:

public function foo() : void { 
     var a : int = 3; 
     a = 0; 
} 

Lý do tương tự có cảnh báo trình biên dịch khi bạn khai báo một số biến hai lần trong phần chức năng.

+0

Nhờ cả hai bạn! Mặc dù nghe có vẻ hơi kỳ lạ với tôi, nhưng cuối cùng tôi cũng biết lý do là –

+0

@Mister Henson, sau đó bạn nên chấp nhận câu trả lời, trừ khi bạn đang đợi cái gì đó tốt hơn :) – Peter

+0

@Peter: Ah ok tôi hiểu rồi, thx tôi vẫn học tập;) –