2013-03-07 31 views
5

Tôi tự hỏi wheter một khối javascript/chức năng là allways có sẵn một lần nạp. Bởi vì tôi đã thử nghiệm một cái gì đó và bây giờ tôi là một chút bối rối. Tôi đã xác định một khối tập lệnh thành một div. Khối script có chức năng xử lý sự kiện cho một phần tử để tải lại div với ajax. Cuộc gọi ajax trả về html thuần túy của div và thay thế nó bằng giá trị hiện tại. Nhưng nó có nghĩa là để thay thế các kịch bản mà làm cho việc thực hiện cũng có. Tôi đã nghĩ rằng kịch bản sẽ bị cắt bỏ thi hành sau khi tuyên bố thay thế. Nhưng nó không. Các dòng mã sau khi câu lệnh thay thế được thực thi Vì vậy, các công cụ này hoạt động như thế nào. Làm thế nào để bạn mô tả thời gian sống của một khối tập lệnh?Làm cách nào để biết thời gian sống của khối tập lệnh hoặc mã javascript?

Trả lời

8

Khi mã được chứa trong phần tử script được đánh giá, kết quả của việc đánh giá mã đó trở thành một phần của môi trường thời gian chạy của trang. Việc xóa phần tử script không loại bỏ các cấu trúc kết quả (chức năng, v.v.) khỏi môi trường. Vì vậy, nếu kịch bản định nghĩa các hàm, hoặc móc các trình xử lý sự kiện cho các phần tử, hoặc tạo các thuộc tính mới trên các đối tượng hiện có (bao gồm đối tượng chung), các hàm, trình xử lý và các thuộc tính đó vẫn còn trong bộ nhớ ngay cả khi script xác định chúng bị loại bỏ khỏi DOM (tùy thuộc vào bộ sưu tập rác JavaScript thông thường; ví dụ, các đối tượng không được tham chiếu ở bất kỳ nơi nào đủ điều kiện cho GC, nhưng phần tử script không có tính năng này). Các yếu tố script chỉ đơn thuần là một cơ chế để truyền đạt mã cho trình duyệt.

+0

Cảm ơn bạn đã trả lời. Tôi đã thêm một quastion nữa. Sau khi tải lại chính xác cùng một khối tập lệnh div với cùng một hàm chính xác đang được tải. Vì vậy, họ đã được công bố hoặc thay thế hoặc bỏ qua? –

+1

@HalilIbrahim: Mã được chạy lại. Nếu bạn có các hàm được khai báo ở phạm vi toàn cục, các hàm đã được thay thế bằng các hàm mới. Nếu bạn có các biến toàn cục được khai báo * không có * initializers (vì vậy, chỉ 'var foo;' không 'var foo = 42;'), vì biến đã được khai báo, khai báo thứ hai sẽ bị bỏ qua. Nếu bạn có initializers hoặc bài tập (vì vậy, 'var foo = 42;' hoặc chỉ 'foo = 42;'), những người đang chạy một lần nữa và do đó 'foo' được thiết lập (trở lại) để' 42'. Vv Tất cả các hiệu ứng của việc chạy mã một lần thứ hai (thứ ba, thứ tư) xảy ra. –

+0

@Crowder: Cảm ơn câu trả lời. –

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