Coffeescript - Bagaimana cara membuat fungsi anonim yang dimulai sendiri?


Jawaban:


160

Meskipun Anda hanya dapat menggunakan tanda kurung (misalnya (-> foo)(), Anda dapat menghindarinya dengan menggunakan dokata kunci:

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

Penggunaan yang paling umum doadalah menangkap variabel dalam satu lingkaran. Misalnya,

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

Tanpa do, Anda hanya akan mencetak nilai xsetelah pengulangan 3 kali.


24
Anda juga dapat menulisf = do -> console.log x
scribu

5
@scribu Nah, kedua pernyataan itu sangat berbeda, dan pernyataan Anda sebenarnya yang seharusnya saya berikan. Milik saya menetapkan fungsi -> console.log 'this runs right away'ke f, lalu menjalankannya; milik Anda menjalankan fungsi dan kemudian memberikan hasilnya ke f, seperti pada pertanyaan awal. (Meskipun dalam kasus console.log, nilai kembaliannya selalu undefinedsaja.)
Trevor Burnham

1
Persis. Selain itu, Anda dapat menentukan properti objek dengan cara ini:{f: do -> // something}
scribu

2
Mulai CoffeeScript 1.3.1 (dirilis April 2012), dojuga memungkinkan Anda meneruskan argumen ke fungsi tersebut. Untuk lulus 1dan 2sebagai parameter xdan y, tulis do (x = 1, y = 2) ->. (Dokumentasi untuk fitur ini telah hilang , tetapi masalah di mana fitur tersebut diperkenalkan memiliki beberapa contoh.)
Rory O'Kane

19

Jika Anda ingin "membuat alias" argumen yang diteruskan ke fungsi pemanggilan mandiri di CoffeeScript, dan katakanlah inilah yang ingin Anda capai:

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

Maka do (window, document) ->tidak akan membiarkan Anda melakukan itu. Cara untuk pergi adalah dengan parens maka:

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

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

16

sangat mudah dalam kopi:

do ->

akan kembali

(function() {})();

5

Anda juga dapat menggabungkan dokata kunci dengan parameter fungsi default untuk menyemai "fungsi yang memulai sendiri" rekursif dengan nilai awal. Contoh:

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


3
do ->
    #your stuff here

Ini akan membuat penutupan yang dijalankan sendiri, yang berguna untuk pelingkupan.


1
Ini sepertinya tidak menambahkan banyak informasi baru dibandingkan dengan jawaban lain yang sudah diposting. Daripada membuat jawaban yang bersaing, Anda dapat menambahkan nilai lebih dengan memposting komentar informatif di bawah jawaban lain yang menambahkan kejelasan atau informasi berguna ke jawaban lain.
still_dreaming_1

1

Maaf, saya menyelesaikannya:

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

1
@Squeegy Saya tidak perlu mengatakan itu. Kata dokunci memiliki beberapa keterbatasan yang terkadang membuatnya perlu untuk menggunakan pendekatan gaya JS (lihat masalah 960 ); dobenar-benar hanya ditambahkan karena kasus penggunaan loop-with-closures.
Trevor Burnham

1
Tapi kami juga tidak menggunakan CoffeeScript untuk meninju wajah kami seperti itu.
Brandon

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.