2009-11-24 35 views
5

Tôi đang cố gắng nhóm một số hàm cấp cao nhất hiện có bên trong một đóng cửa (để tránh gây ô nhiễm không gian tên chung) nhưng tôi không hoàn toàn làm cho nó hoạt động.Đóng/phạm vi JavaScript/jQuery

Đầu tiên, tất cả JS hoạt động bên ngoài chức năng ẩn danh của tôi, nhưng khi tôi đặt vào chức năng ẩn danh, tôi nhận được lỗi "crossfade không phải là được xác định". Có ai nhìn thấy bất cứ điều gì hoàn toàn rõ ràng rằng tôi thiếu không?

Tôi không hiểu tại sao setInterval/crossfade hoạt động bên ngoài chức năng ẩn danh nhưng không ở bên trong. Bất cứ điều gì bên trong start() nên có thể nhìn thấy vars/chức năng bên ngoài bắt đầu() và tất cả nên được bảo vệ trong đóng cửa được tạo ra bởi các chức năng vô danh cấp cao nhất? Tôi không cố gắng truy cập vào bất kỳ nội dung nào trong vòng crossfade(), tôi chỉ cần cố gắng thực hiện.

(function($) { 

    //vars up here that internal functions can access 
    //also using some jquery inside here, so using $ 

    function crossfade() { 
     //body here 
    } 

    //other functions 

    function start() { 
     //body here 

     cInterval = setInterval('crossfade()', 5000); 
    } 

})(jQuery); 

Trả lời

7

Phương pháp setInterval sẽ được chạy trong phạm vi của cửa sổ, vì vậy chức năng crossfade không tồn tại ở đó. Bạn cần phải thực hiện một chức năng ẩn danh để đóng cửa được tạo ra có chứa một tham chiếu đến các chức năng:

cInterval = window.setInterval(function() { crossfade(); }, 5000); 
+0

Cảm ơn nhiều điều này đang làm việc cho tôi. –

8

Sử dụng setInterval('crossfade()', 5000); không tạo ra một đóng cửa - nó tạo ra một chuỗi được eval() d. Bạn nên sử dụng một chức năng thay vì:

setInterval(function() { crossfade(); }, 5000); 
+6

Tôi muốn sử dụng setInterval (crossfade, 5000); – Nosredna

1

Để tránh gây ô nhiễm phạm vi toàn cầu, bạn có thể làm một vài điều:

  • Mở rộng jQuery , vì bạn đã sử dụng jQuery. (Sử dụng jQuery làm không gian tên.)
  • Tạo một đối tượng duy nhất để giữ các phương pháp của bạn. (Tạo không gian tên của riêng bạn.)
2

Khi setInterval được chuyển một chuỗi, chuỗi được đánh giá trong phạm vi toàn cầu. Điều đó giải thích tại sao crossfade không hiển thị khi setInterval kích hoạt.

setInterval cũng có thể được thông qua một tài liệu tham khảo chức năng:

setInterval(crossfade, 5000); 

trong trường hợp này mã của bạn sẽ làm việc như mong đợi, vì crossfade hiển thị tại điểm mà bạn gọi setInterval.

+0

Vâng, tôi đã thử điều này, nhưng tôi nhận được một lỗi về nó không được gọi với dấu ngoặc kép. –

+0

Cách ưa thích là không có dấu ngoặc kép. Bạn nhận được thông báo lỗi nào, chính xác? – Nosredna