2008-10-26 34 views
12

Tôi cố gắng để gọi một setTimeout từ bên trong một callback setInterval:Làm thế nào để giải quyết Var ra khỏi phạm vi trong vòng setTimeout gọi

function callback() 
{ 
    //assign myVar 
    var myVar = document.getElementById("givenID"); 
    //... 
    //now wait 2 secs then call some code that uses myVAr 
    setTimeout("myVar.innerHTML = 'TEST'", 2000); 
} 

setInterval("callback();", 10000); 

setInterval việc như mong đợi nhưng cuộc gọi setTimeout là không. Tôi đoán vấn đề có liên quan đến thực tế là tôi đang tham chiếu một biến (myVar) không nằm trong phạm vi.

Cách tốt nhất để giải quyết vấn đề này là gì?

+0

Sử dụng đóng cửa như tôi chỉ ra dưới đây sẽ làm việc xung quanh này, việc đóng cửa bên trong có quyền truy cập vào phạm vi đóng cửa bên ngoài. – FlySwat

+0

Tôi phải bỏ lỡ điều gì đó - bạn đang cố gắng tiết kiệm một số hiệu suất bằng cách tính toán myVar? Tại sao không phải là setTimeout ("document.getElementById (" givenID "). InnerHTML = 'TEST'", 2000); ? –

+1

Không sử dụng dấu ngoặc kép với setTimout/setInterval, nó buộc thời gian chạy JS gọi lệnh Eval, chạy mã trong ngữ cảnh mới, do đó vấn đề phạm vi. – FlySwat

Trả lời

32

Đây là một ứng cử viên hoàn hảo cho việc đóng cửa:

setInterval(
    function() 
    { 
     var myVar = document.getElementById("givenID"); 
     setTimeout(
      function() 
      { 
       // myVar is available because the inner closure 
       // gets the outer closures scope 
       myVar.innerHTML = "Junk"; 
      },2000); 
    }, 10000); 

vấn đề của bạn là phạm vi liên quan, và điều này sẽ làm việc xung quanh đó.

+0

Tôi đoán bạn nói đúng - tôi đã chỉnh sửa câu hỏi – JohnIdol

+2

Do đó minh họa một lý do tuyệt vời để không truyền chuỗi như tham số cho setTimeout và setInterval! :-) –

+0

chắc chắn Andrew - Tôi đã bỏ phiếu cho bạn :-) – JohnIdol

1

Chạy trong Firefox và chọn Công cụ | Bảng điều khiển lỗi. nếu setTimeout không thành công, nó có thể cho bạn biết lý do tại sao.

Ngoài ra, hãy thử thay thế "someFunction();" bằng "alert('hi')" (không có dấu chấm phẩy) và xem có hoạt động không. Nếu vậy, vấn đề sẽ bị thu hẹp đáng kể.

+0

chúc mừng - Tôi đã làm điều này và nhận thấy sự cố không liên quan đến setTimeout - xem chỉnh sửa – JohnIdol

4

Như một vấn đề của thực hành tốt nhất, cố gắng không sử dụng chuỗi như tham số cho setTimeoutsetInterval vì đó sẽ gọi eval ... Sử dụng các hình thức sau đây cũng có thể làm cho vấn đề này dễ dàng hơn để hiểu/debug:

setInterval(function() { 
    // do stuff 
    // ... 
    // now wait 2 secs then call someFunction 
    setTimeout(someFunction, 2000); 
}, 10000); 
+0

đề xuất tuyệt vời - cảm ơn – JohnIdol

11

Tôi gặp sự cố tương tự. Vấn đề là tôi đã cố gắng gọi một phương thức từ bên trong nó thông qua một setTimeout(). Một cái gì đó như thế này, mà không làm việc cho tôi:

function myObject() { 

    this.egoist = function() { 
     setTimeout('this.egoist()', 200); 
    } 

} 

myObject001 = new myObject(); 
myObject001.egoist(); 

Sau đây CŨNG KHÔNG LÀM VIỆC:

... setTimeout(egoist, 200); 
... setTimeout(egoist(), 200); 
... setTimeout(this.egoist, 200); 
... setTimeout(this.egoist(), 200); 
... setTimeout(function() { this.egoist() }, 200); 

Giải pháp là để sử dụng với() tuyên bố như vậy:

function myObject() { 

    this.egoist = function() { 
     with (this) { setTimeout(function() { egoist() }, 200);} 
    } 

} 

myObject001 = new myObject(); 
myObject001.egoist(); 

Tất nhiên, đây là một chu trình bất tận, nhưng điểm tôi làm ở đây là khác nhau.

Hope this helps :)

+0

tốt đẹp, các 'với' tuyên bố là dưới đánh giá theo ý kiến ​​của tôi .. – Alex

+0

điều này đã giúp: D cảm ơn –

+2

khám phá "với (này) "làm cho ngày của tôi, cảm ơn bạn! – WebChemist

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