2012-03-01 31 views
8

Nói rằng tôi có một chức năng đơn giản mà cảnh báo cho một tin nhắn:Tại sao việc đóng cửa này hoạt động?

function callMessage(msg){ 
     alert(msg); 
    } 

Bây giờ khi tôi gọi nó như vậy, nó không hoạt động. Ném lỗi "hey không được định nghĩa"

function sayHi(){ 
     var hey = "hi there" 
     setTimeout("callMessage(hey)", 1000); 
    } 
    sayHi(); 

Nhưng khi tôi gọi nó bên trong một chức năng ẩn danh nó không làm việc:

function sayHi(){ 
     var hey = "hi there" 
     setTimeout(function(){callMessage(hey);}, 1000); 
    } 
    sayHi(); 

Tại sao là "hey" biến chỉ hiển thị khi tôi đặt nó bên trong một chức năng ẩn danh?

+1

tôi cũng sẽ thử cái này; 'setTimeout (" var hey = 'hi there'; callMessage (hey) ", 1000);' – mindandmedia

+0

Nếu tôi là bạn, tôi sẽ đọc một cái gì đó như - http://www.digital-web.com/articles/scope_in_javascript/ –

Trả lời

14

Trong ví dụ đầu tiên, mã được đánh giá sau bộ hẹn giờ đã hết hạn và phạm vi hiện tại còn lại. hey không xác định tại thời điểm đó.

Ví dụ thứ hai - cách thích hợp để sử dụng setTimeout - sử dụng chức năng ẩn danh được tạo khi gọi setTimeout(). Hàm ẩn danh này cũng nhận được một bản sao của phạm vi hiện tại.

+0

Trong ví dụ thứ hai, cơ thể của đóng không được đánh giá cho đến lúc đó. – sepp2k

+2

Nó không phải là * thực hiện * cho đến sau này. Cái đầu tiên là * theo nghĩa đen * được đánh giá ('eval()') không có gợi ý về phạm vi nào sẽ được sử dụng bởi vì nó chỉ là một chuỗi. –

+0

Điều đó có ý nghĩa. Tôi không biết các hàm ẩn danh có một bản sao phạm vi cha mẹ của nó – levi

6

"callMessage (hey)" là một chuỗi chứ không phải là đóng. Nó được đánh giá khi hết thời gian chờ và tại thời điểm này biến số không nằm trong phạm vi.

3

bình thường.

Ví dụ thứ hai tạo ra cái mà chúng tôi gọi là lịch thi đấu, đây là ngữ cảnh thực thi. biến biến này được lưu để được sử dụng bởi hàm ẩn danh trong bộ nhớ.

Trong ví dụ đầu tiên của bạn, hey biến không được lưu trong một trận đấu (vì javascript không thể biết rằng bạn sẽ sử dụng các biến sau) và do đó không thể được lấy ra khi chuỗi được đánh giá

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