2009-09-27 38 views
11

Tôi là một chút mới đối với Actionscript, nhưng tôi không thể tìm ra điều này. Tôi đã thực hiện rất nhiều tìm kiếm về chủ đề này và không tìm thấy câu trả lời rõ ràng. Tôi đã thử các giải pháp sau đây mà mọi người đã đăng trực tuyến nhưng không ai trong số họ làm việc.Actionscript3: Biến có tồn tại không?

Tất cả các giải pháp sau cung cấp cho các lỗi: 1120: Truy cập tài sản myVariable không xác định

Đề xuất # 1:

try { 
    trace(myVariable); } 
catch { 
    trace("your variable doesn't exist"); } 

Đề xuất # 2:

if (myVariable) { 
    trace("your variable exists!!"); } 
else { 
    trace("it doesn't exist"); } 

Đề xuất # 3:

if (myVariable == null) 
    trace("your variable doesn't exist"); 

Đề xuất # 4:

if (myVariable == undefined) 
    trace("your variable doesn't exist"); 

Như tôi đã nói, tôi đã tìm thấy nhiều diễn đàn bài viết và các công cụ trực tuyến mà cung cấp cho các gợi ý ở trên nói rằng họ sẽ công việc, nhưng tất cả họ dường như đang cho tôi cùng một số 1120: Truy cập tài sản không xác định myVariable lỗi. Bằng cách này, trong trường hợp bạn đang tự hỏi tại sao tôi sẽ cần phải kiểm tra xem một biến tồn tại hay không, tôi đang lên kế hoạch truyền các biến cho SWF trong URL của nó, vì vậy tôi cần đảm bảo rằng các biến thích hợp tồn tại và xử lý mã đúng cách nếu chúng không được chuyển.


Cảm ơn bạn đã trả lời nhanh. Vẫn không thực sự làm việc. Phạm vi của biến chỉ ở cấp trên cùng/gốc của tập lệnh. Về cơ bản, tôi bắt đầu một file flash mới, vào frame đầu tiên tôi thêm các hành động sau đây:

// to check for this.myVariable 
if (this.hasOwnProperty("myVariable")) { 
    trace("myVariable exists"); 
} 
else 
{ 
    //Variable doesn't exist, so declare it now 
    trace("declaring variable now..."); 
    var myVariable = "Default Value"; 
} 

trace(myVariable); 

Khi tôi chạy tập tin flash, tôi nhận được kết quả này:

myVariable exists 
undefined 

Tôi đã chờ đợi điều này:

declaring variable now... 
Default Value 

Trả lời

5

By the way, in case you are wondering why I would need to check if a variable exists or not, I'm planning on passing variables to the SWF in its URL, so I need to make sure the proper variables exist and handle the code properly if they are not passed in.

Sau đó, bạn đang sử dụng phương pháp sai.Đây là cách đúng để đọc và xác thực các tham số SWF, cùng với giá trị mặc định nếu chúng không tồn tại:

private function parameter(name:String, defaultValue:String):String 
{ 
     // Get parameter list 
    var paramObj:Object = LoaderInfo(stage.loaderInfo).parameters; 

     // Check if parameter exists 
    if(paramObj.hasOwnProperty(name) && paramObj[name] != "") 
     return paramObj[name];      
    else 
     return defaultValue; 
} 

Cảnh báo! Vì điều này chuyển tiếp trên thuộc tính 'giai đoạn', hãy sử dụng mã này hoặc từ Lớp tài liệu hoặc sau Event.ADDED_TO_STAGE.

+0

Điều này hoạt động hoàn hảo! Cảm ơn! –

+0

BẬT upvote cho nhãn hiệu trên 'đúng cách'. –

12

LiraNuna của câu trả lời chắc chắn là đúng cách để truy cập các thông số bộ nạp. Tuy nhiên, để trả lời câu hỏi làm thế nào để kiểm tra sự tồn tại của các biến (cho hậu thế), điều này được thực hiện với phương pháp hasOwnProperty(), mà tồn tại trên tất cả các đối tượng:

// to check for this.myVariable 
if (this.hasOwnProperty("myVariable")) { 
    trace("myVariable exists"); 
} else { 
    //Variable doesn't exist, so declare it now 
    trace("declaring variable now..."); 
    this.myVariable = "Default Value"; 
} 

trace(this.myVariable); 

đó phải bao trùm tình hình của bạn. Nhưng tôi không biết bất kỳ cách nào để kiểm tra sự tồn tại của một biến theo cách bạn đang cố gắng làm, bằng cách chỉ đơn thuần là tạo một tham chiếu trực tiếp đến biến đó. Tôi tin rằng bạn phải tham khảo nó thông qua phạm vi của nó.

0

fenomas có lẽ là đúng nhất. (Tôi có lẽ nên sửa đổi một số mã của tôi để sử dụng phương pháp đó). Nhưng phương pháp tôi hiện đang sử dụng cho các lớp học là:

try { 
    if(this["myFunction") { 
    this["myFunction"](); 
    } 
catch(e:Error) {} 

không phải là trang nhã nhất vì nó ném ngoại lệ.

Lý do tôi sử dụng loại mã này là chúng tôi đang thực hiện một chút mã hóa động và lạm dụng "bao gồm" trong flex để viết mã bản mẫu.

0

theo dõi (myVariable);

0

Khi không có sẵn giai đoạn, bạn có thể thử trích xuất tham số từ root.loaderInfo.parameters. Hãy cẩn thận để kiểm tra xem mỗi tài sản của chuỗi là null.

if(root != null && root.loaderInfo != null && root.loaderInfo.parameters != null) { 
    myVar = root.loaderInfo.parameters.myVar; 
} 
+0

'root' sẽ không khả dụng nếu DisplayObject không nằm trong danh sách hiển thị. – LiraNuna

0
if (myVariable === "undefined") { 
     trace("variable doesn't exist"); 
    else 
     trace("variable exists"); 

Lưu ý các toán tử so sánh ba. Đó là một mẹo nhỏ tôi đã học được từ những ngày Javascript của tôi. Cũng hoạt động trong AS3 và nó hữu ích để kiểm tra nếu phần tử mảng tồn tại ngay cả khi null. Như thế này:

var array:Array = ["zero", 1, null]; 
if (array[2]) //returns false 
if (array[2] !== "undefined") //returns true 
0

Tôi đã gặp vấn đề tương tự gần đây và tôi đã tìm cách sửa lỗi này. Tuy nhiên, tôi đã phát hiện ra rằng khi bạn đăng ký biến như vậy ...

var i:int; 

... nó không thiết lập lại các biến nếu nó đã được thực hiện. Ví dụ, nếu đây là mã của tôi trên Frame 1:

var i:int; 
if (i > 0){ 
    i++; 
} else { 
    i = 1; 
} 

Sau đó, chúng sẽ được các giá trị của "i" mỗi khi đèn flash quay ngược lại so với cùng khung:

// First Iteration 
trace(i); // 1 
// Second Iteration 
trace(i); // 2 
// Third 
trace(i); // 3, etc... 

Nó làm việc trong tôi dự án của riêng mình, và đó là mã LOT ít hơn so với câu trả lời trước đó. Hy vọng nó cũng làm việc cho bạn.

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