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.

Trevor Burnham
sumber
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 ) 
Misha Reyzlin
sumber
5
do (global=window, doc=document) ->
Billy Moon
16

sangat mudah dalam kopi:

do ->

akan kembali

(function() {})();
mart7ini
sumber
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
XåpplI'-I0llwlg'I -
sumber
5

coba gunakan

do ($ = jQuery) ->
Pavel Blagodov
sumber
3
do ->
    #your stuff here

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

Jordan Checkman
sumber
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"
)()
pengguna537339
sumber
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
0

Harus

f = () ->
  # do something
Alongkorn Chetasumon
sumber