2013-03-12 27 views
7

tôi đã sử dụng mã này (tiếp theo là một XMLHttpRequest mà lấp đầy "TCAP" textarea):setTimeout có hoặc không có chức năng ẩn danh? Có gì khác biệt?

st=setTimeout(checkme(),4000) 

nơi checkme() là:

function checkme() { 
    if (typeof (st) != 'undefined') clearTimeout(st) 
    if (document.getElementById("tcap").innerHTML.length > 0) { 
     document.getElementById('waitmsg').style.display = 'none' 
    } else { 
     st = setTimeout(checkme(), 1000) 
    } 
} 

Nếu tôi chạy nó, nó đóng băng Firefox 19 với không có thông báo lỗi. Nhưng nếu tôi thay thế các đối số đầu tiên (cả trong mã và trong checkme() chức năng) với:

st=setTimeout(function(){checkme()},4000) 

nó hoạt động một cách chính xác. Vì vậy, câu hỏi của tôi là: sự khác biệt trong việc gọi hàm checkme() có hoặc không có hàm anon là gì? Tại sao trong trường hợp đầu tiên nó đóng băng Firefox?

Cảm ơn

Trả lời

11

Bạn cần phải loại bỏ các dấu ngoặc trong

st=setTimeout(checkme(),4000) 

nên thay vì:

st=setTimeout(checkme,4000) 

khác, chức năng được gọi ngay lập tức.

Vì bạn có cùng một lỗi bên trong chức năng checkme, nó có thể giết chết trình duyệt của bạn do đệ quy không bị chặn.

1

Bạn không nên sử dụng dấu ngoặc đơn trong hàm setTimeout. Bạn chỉ nên chuyển qua tham chiếu đến phương thức. Những gì bạn đang làm là gọi phương thức và chuyển giá trị trả về vào phương thức timeout đã đặt.

5

setTimeout chấp nhận hàm làm đối số và cách chính xác để chuyển một hàm làm đối số hoặc xác định hàm dưới dạng hàm ẩn danh hoặc chỉ cung cấp tên hàm. Nếu bạn sử dụng dấu ngoặc đơn (ngoặc đơn), bạn không thực sự chuyển một hàm: Bạn đang thực thi hàm và chuyển kết quả của hàm đến setTimeout.

Do đó, khi chỉ định một hàm trong setTimeout và bất kỳ nơi nào khác bạn cần chuyển một hàm làm đối số, bạn không nên sử dụng dấu ngoặc đơn.

1

Nếu bạn đang sử dụng setTimeout(checkme(),4000), bạn đang chuyển giá trị trả về của checkme(); Nhưng nếu bạn muốn vượt qua nó như một chức năng bạn cần làm theo những cách sau đây

setTimeout(function(){checkme()},4000) 

hoặc

st=setTimeout(checkme,4000)