Coffeescript - Kendi kendine başlayan bir anonim işlev nasıl oluşturulur?


Yanıtlar:


160

Parantez kullanabilirsiniz (örneğin (-> foo)(), doanahtar kelimeyi kullanarak bunlardan kaçınabilirsiniz :

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

En yaygın kullanım, dobir döngüdeki değişkenleri yakalamaktır. Örneğin,

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

Bu olmadan, döngüden sonraki dodeğeri x3 kez yazdırırsınız .


24
Ayrıca yazabilirsinizf = do -> console.log x
scribu

5
@scribu Pekala, bu iki ifade çok farklı ve aslında vermem gereken şey seninki. Mayın fonksiyonunu atar -> console.log 'this runs right away'etmek fsonra çalışır; sizinki işlevi çalıştırır ve ardından sonucunu f, orijinal soruda olduğu gibi atar . (Yine de, console.logdönüş değeri her zaman undefinedzaten olur.)
Trevor Burnham

1
Kesinlikle. Ayrıca, nesne özelliklerini şu şekilde tanımlayabilirsiniz:{f: do -> // something}
scribu

2
CoffeeScript 1.3.1'den itibaren (Nisan 2012'de yayınlandı), doişleve argümanlar iletmenize de izin veriyor. Geçmek için 1ve 2parametreler olarak xve yyazın do (x = 1, y = 2) ->. (Bu özelliğin belgeleri kayboldu , ancak özelliğin sunulduğu sorunun bazı örnekleri var.)
Rory O'Kane,

19

CoffeeScript'te kendi kendini çağıran işleve aktarılan argümanları "takma" olarak adlandırmak istiyorsanız ve bunu başarmaya çalıştığınız şey diyelim:

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

O do (window, document) ->zaman bunu yapmana izin vermeyeceğim. Gitmenin yolu parantez kullanmaktır o zaman:

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

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


5

doÖzyinelemeli "kendi kendine başlatan işlevleri" bir başlangıç ​​değeriyle tohumlamak için anahtar sözcüğü varsayılan işlev parametreleriyle birleştirebilirsiniz . Misal:

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


3
do ->
    #your stuff here

Bu, kapsam belirleme için yararlı olan, kendi kendine çalışan bir kapanma yaratacaktır.


1
Bu, daha önce gönderilmiş olan diğer cevaplarla karşılaştırıldığında pek çok yeni bilgi eklemiyor gibi görünüyor. Rakip bir cevap oluşturmak yerine, diğer cevaba biraz netlik veya faydalı bilgiler ekleyen başka bir cevabın altına bilgilendirici bir yorum göndererek daha fazla değer katabilirsiniz.
still_dreaming_1

1

Özür dilerim, çözdüm:

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

1
@Squeegy Bunu mutlaka söylemem. doAnahtar kelime gerekli, bazen JS tarzı bir yaklaşım kullanmak yapan bazı sınırlamaları vardır (bkz sorunu 960 ); dogerçekten yalnızca kapanan döngü kullanım durumu nedeniyle eklendi.
Trevor Burnham

1
Ama kendimizi böyle bir yumruk atmak için CoffeeScript kullanmıyoruz.
Brandon

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.