Coffeescript - Làm thế nào để tạo một hàm ẩn danh tự khởi tạo?


Câu trả lời:


160

Mặc dù bạn chỉ có thể sử dụng dấu ngoặc đơn (ví dụ: (-> foo)()bạn có thể tránh chúng bằng cách sử dụng dotừ khóa:

do f = -> console.log 'this runs right away'

Việc sử dụng phổ biến nhất dolà bắt các biến trong một vòng lặp. Ví dụ,

for x in [1..3]
  do (x) ->
    setTimeout (-> console.log x), 1

Nếu không có do, bạn chỉ in giá trị của xsau vòng lặp 3 lần.


24
Bạn cũng có thể viếtf = do -> console.log x
scribu

5
@scribeu Chà, hai câu đó rất khác nhau, và câu của bạn thực sự là câu mà tôi nên đưa ra. Mine gán chức năng -> console.log 'this runs right away'tới f, sau đó chạy nó; của bạn chạy hàm và sau đó gán kết quả của nó cho f, như trong câu hỏi ban đầu. (Mặc dù trong trường hợp console.log, giá trị trả về luôn là undefinedanyway.)
Trevor Burnham

1
Chính xác. Ngoài ra, bạn có thể xác định các thuộc tính đối tượng theo cách này:{f: do -> // something}
scribu

2
Kể từ CoffeeScript 1.3.1 (phát hành tháng 4 năm 2012), docũng cho phép bạn chuyển các đối số cho hàm. Để chuyển 12dưới dạng các tham số xy, viết do (x = 1, y = 2) ->. (Tài liệu về tính năng này đã bị mất , nhưng vấn đề nơi tính năng được giới thiệu có một số ví dụ.)
Rory O'Kane

19

Nếu bạn muốn "bí danh" các đối số được truyền cho hàm tự gọi trong CoffeeScript và giả sử đây là những gì bạn đang cố gắng đạt được:

(function ( global, doc ) {
  // your code in local scope goes here
})( window, document );

Sau đó do (window, document) ->sẽ không cho phép bạn làm điều đó. Cách để đi là với parens sau đó:

(( global, doc ) -> 
  # your code here
)( window, document ) 

5
do (global=window, doc=document) ->
Billy Moon

16

thật nực cười trong cà phê:

do ->

sẽ trở lại

(function() {})();

5

Bạn cũng có thể kết hợp dotừ khóa với các tham số hàm mặc định để gieo "các hàm tự khởi tạo" đệ quy với giá trị ban đầu. Thí dụ:

do recursivelyPrint = (a=0) ->
  console.log a
  setTimeout (-> recursivelyPrint a + 1), 1000


3
do ->
    #your stuff here

Điều này sẽ tạo ra một bao đóng tự thực thi, rất hữu ích cho việc xác định phạm vi.


1
Điều này dường như không thêm nhiều thông tin mới so với các câu trả lời khác đã được đăng. Thay vì tạo ra một câu trả lời cạnh tranh, bạn có thể tăng thêm giá trị bằng cách đăng một nhận xét giàu thông tin dưới một câu trả lời khác để bổ sung một số thông tin rõ ràng hoặc hữu ích cho câu trả lời kia.
still_dreaming_1

1

Xin lỗi, tôi đã giải quyết nó:

f = (
    () -> "something"
)()

1
@Squeegy Tôi không nhất thiết phải nói như vậy. Các dotừ khóa có một số hạn chế mà làm cho nó cần thiết để sử dụng phương pháp JS-phong cách đôi khi (xem vấn đề 960 ); dothực sự chỉ được thêm vào vì trường hợp sử dụng loop-with-close.
Trevor Burnham

1
Nhưng chúng tôi cũng không sử dụng CoffeeScript để tự đấm vào mặt mình như vậy.
Brandon

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.