Câu trả lời:
Tôi nghĩ rằng đó là một quy ước hữu ích cho các cuộc gọi lại để trở thành đối số cuối cùng cho một chức năng. Ví dụ, đây thường là trường hợp với API Node.js. Vì vậy, với ý nghĩ đó:
delay = (ms, func) -> setTimeout func, ms
delay 1000, -> something param
Cấp, điều này thêm chi phí của một cuộc gọi chức năng bổ sung cho mỗi setTimeout
bạn thực hiện; nhưng trong các trình thông dịch JS ngày nay, nhược điểm về hiệu năng là không đáng kể trừ khi bạn thực hiện nó hàng nghìn lần mỗi giây. (Và bạn đang làm gì để thiết lập hàng ngàn thời gian chờ mỗi giây, dù sao?)
Tất nhiên, một cách tiếp cận đơn giản hơn là chỉ cần đặt tên cho cuộc gọi lại của bạn, điều này có xu hướng tạo ra mã dễ đọc hơn (jashkenas là một fan hâm mộ lớn của thành ngữ này):
callback = -> something param
setTimeout callback, 1000
setTimeout ( ->
something param
), 1000
Các dấu ngoặc là tùy chọn, nhưng bắt đầu dòng bằng dấu phẩy có vẻ lộn xộn đối với tôi.
setTimeout
và paren mở rất quan trọng. Không gian ở đó có nghĩa là dấu ngoặc đơn bao quanh bao đóng làm tham số đầu tiên cho setTimeout; nếu nó trực tiếp sau t thì coffescript sẽ mong các dấu ngoặc đơn kèm theo cả hai tham số.
setTimeout ->
something param
, 1000
something param
trên cùng một dòng với setTimeout
, nó được phân tích cú pháp khác nhau.
Điều này sẽ dẫn đến một bản dịch gần tương đương (cảm ơn @Joel Mueller):
setTimeout (-> something param), 1000
Lưu ý rằng đây không phải là bản dịch chính xác vì hàm ẩn danh trả về kết quả của cuộc gọi something(param)
thay vì không xác định, như trong đoạn trích của bạn.
setTimeout (() -> something param), 1000
Tôi thấy đây là phương pháp tốt nhất để làm điều tương tự,
setTimeout (-> alert "hi"), 1000