2012-11-10 26 views
5

Tôi không hiểu những gì là sai. Tôi có ba mã:
Đầu tiên:setInterval bên trong một hàm sản xuất một lỗi: biến không được xác định

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
</script> 



Thứ hai:

<script language="JavaScript" type="text/javascript"> 
    function countdown() 
    { 
    var count = 0; 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



Thứ ba:

<script language="JavaScript" type="text/javascript"> 
    var count = 0; 
    function countdown() 
    { 
    alert(count); 
    var timer = setInterval("count = count + 1; alert(count);",10000); 
    } 
    countdown(); 
</script> 



Mã đầu tiên hoạt động tốt, thứ hai tạo ra một lỗi trong dòng "setInterval": "đếm không được xác định" và mã thứ ba hoạt động tốt trở lại. Phạm vi của biến "đếm" phải là toàn cục cho hàm setInterval trong mã thứ hai. Tại sao nó không? Tôi đang sử dụng Mozilla Firefox. Cảm ơn.

+0

Bạn chỉ tìm thấy một trong những lý do tại sao bạn không nên sử dụng chuỗi làm gọi lại cho setInterval/setTimeout. Hãy xem các câu hỏi liên quan ở bên phải, tôi đặt cược một nửa trong số họ chia sẻ cùng một vấn đề. – Yoshi

Trả lời

8

Vì nhiều lý do, một trong số đó bạn đã gặp phải, không bao giờ bao giờ chuyển một chuỗi đến setTimeout hoặc setInterval. Không bao giờ. Ý tôi là nó. Không bao giờ có lý do chính đáng.

Vượt qua một hàm thay thế. Khả năng truyền các đối tượng hàm xung quanh là một trong những tính năng tốt nhất của JS.

var count = 0; 
alert(count); 

var timer = setInterval(function(){ 
    count = count + 1; 
    alert(count); 
}, 10000); 

Vấn đề bạn đang gặp phải là mã đó theo cách này sẽ không tôn trọng phạm vi. Nó sẽ thực thi trong phạm vi toàn cục, là nơi mà biến của bạn không tồn tại trong các đoạn mã thứ 2 và thứ 3 của bạn. Và đoạn đầu tiên hoạt động vì count thực sự là một biến toàn cầu.

Các vấn đề khác với gốc này thực tế về cơ bản là eval kèm theo đau đầu và tốt nhất là tránh hoàn toàn. Eval is Evil.

+0

Xin chào, Alex Wayne! Cảm ơn đã giúp đỡ. Tôi không hiểu tại sao chuỗi này lại quá tệ, nhưng tôi sẽ thử bằng cách theo liên kết bạn đã cung cấp. Kỳ lạ là vấn đề không được đề cập trong những cuốn sách tôi đọc. – GreenBear

+0

Tóm lại, nó xấu vì nó chậm và có khả năng nguy hiểm (như eval) và nó hoạt động theo những cách bạn không mong đợi. Tất cả những điều đó được giải quyết bằng cách sử dụng một hàm thực tế thực sự. –

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