2011-11-01 73 views

Trả lời

6

myFunction là một chức năng

myFunction() gọi hàm và sản lượng bất kỳ giá trị trở về chức năng.

Mục đích của setTimeout đang chạy mã sau một thời gian trôi qua. Bạn chỉ cần truyền hàm này cho nó (vì vậy setTimeout có thể tự gọi hàm khi thích hợp) bởi vì nếu bạn gọi hàm (với dấu ngoặc đơn) trước khi chuyển nó tới setTimeout, nó sẽ thực hiện bây giờ thay vì sau 1 giây.

+0

Ồ ... Điều đó có ý nghĩa. –

17

Chức năng setTimeout mong đợi tham chiếu hàm * làm đối số: tham chiếu là biến và không có dấu ngoặc đơn.

Chức năng gọi yêu cầu dấu ngoặc đơn (ngay cả khi chức năng không có tham số).

Nutshell:myFunction là tham chiếu đến hàm. myFunction() thực thi hàm, và trong một biểu thức, sẽ "bằng" giá trị trả lại của hàm (hoặc undefined nếu không có gì được trả về).

Đào sâu: Có trường hợp setTimeout(myFunction(), 1000) thể có ý nghĩa, như thế nào nếu myFunction() tự trả một hàm. Ví dụ:

var myFunction = function() { 
    return function() { 
     alert("ohai"); 
    }; 
}; 
  • Các chức năng ẩn danh (có chứa một return tuyên bố đơn) được thực hiện ngay lập tức.
  • Giá trị trả về của hàm đó chính là hàm có chứa alert.

Vì vậy:

  • myFunction mình là một tham chiếu đến một chức năng (điều đó xảy ra để trả về một hàm).
  • myFunction() sẽ thực thi. Nó đánh giá tham chiếu hàm, thích hợp cho setTimeout().

Cuối cùng:

setTimeout(myFunction(), 1000); 

Điều này đòi hỏi giá trị trả về myFunction() 's trong một giây. Một giây sau, bật lên cảnh báo.

Xem thêm Why function statement requires a name?

* Hoặc một chuỗi để được đánh giá, nhưng một tài liệu tham khảo được ưa thích.

+0

Những gì anh ấy nói ^^^^^ – JonH

+1

Lạ. JavaScript là một ngôn ngữ kỳ quặc. –

+2

@cf_PhillipSenn: Về cơ bản giống với Python hoặc C (con trỏ hàm). Chỉ cung cấp tên hàm tham chiếu nó. Thêm dấu ngoặc đơn đằng sau nó gọi nó. Tất nhiên điều này không tồn tại trong các ngôn ngữ mà các hàm không phải là các đối tượng lớp đầu tiên và do đó không thể được tham chiếu trực tiếp (chẳng hạn như Java). –

2

Trong dòng 2, hàm myFunction không được gọi, nhưng được chuyển làm đối số cho hàm setTimeout, trong khi ở dòng 4 myFunction được gọi; để gọi hàm, bạn luôn luôn phải sử dụng dấu ngoặc đơn, ngay cả khi không có đối số.

+1

Tôi nghĩ rằng một bóng đèn 25 watt chỉ tiếp tục. –

5

Khi bạn sử dụng dấu ngoặc đơn, cụm từ này nói 'gọi hàm này ngay bây giờ'. Vì vậy, nếu bạn nói setTimeout(myFunction(),1000);, nó sẽ sử dụng giá trị trả lại của hàm làm cuộc gọi lại cho thời gian chờ. Nếu giá trị trả về của hàm không phải là một hàm, bạn sẽ nhận được một lỗi vì nó sẽ cố gắng thực thi một cái gì đó không thực thi được sau khi hết thời gian chờ (một chuỗi, một số, không xác định, vv).

+0

Ah yeah. ĐƯỢC. Cảm ơn! –

+0

Mặc dù, đáng chú ý: Nếu chuỗi được trả lại là cái gì đó có thể thực thi được, như là 'alert (" Hello world! ");' Nó sẽ hoạt động trong ngữ cảnh này bởi vì 'setTimeout' có thể chấp nhận chuỗi như js code literals. – Chris

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