CoffeeScript ve Adlandırılmış İşlevler


10

Başka yerlerde , CoffeeScript'te adlandırılmış bir işlevin terminolojisi hakkında bir tartışma ortaya çıkmıştır. Özellikle böyle bir şeye değinen biri:

 foo = ->
    console.log("bar")

adlandırılmış bir işlev olarak. Ancak, CoffeeScript'teki her şeyin anonim işlevler olduğu ve adlandırılmış işlevlerin olmadığı itiraz edilmiştir. Bu kesinlikle doğrudur, CoffeeScript yalnızca daha sonra bir değişkende saklanabilen fonksiyon ifadelerine sahiptir. Ama bunun buna adlandırılmış bir işlev demenin yanlış olduğu anlamına gelmediğini düşünüyorum.

Gördüğüm gibi, adlandırılmış bir işlevdir çünkü onun adı verilen bir işlevdir. Doğru, bazı diğer diller işlevleri adlandırdığı şekilde adlandırılmış bir işlev değil, ancak adlandırılmış bir işlev olarak adlandırmanın uygun olmadığı kadar yakın olduğunu düşünüyorum. Aksi takdirde ısrar etmek sadece çıngırak gibi görünüyor.

Bunun isimlendirilmiş bir işlev olmadığını ısrarla nitelendirmek için öğle yemeğine mi çıkıyorum?


3
Bütün bu soru sadece nitpick değil mi? :-)
Mat

@Mat, evet görünüyor gibi nitpicking hakkında nitpicking önlemek
Winston Ewert

Konuştuğum küçük programcılar havuzu için (programcılar.SE dışında) çoğunlukla JavaScript'in adlandırılmış işlevlerini "sınıflar" (yapıcılar) olarak kullanmak için kullandıklarını söylerken, düz eski işlevler için değişkenlerde saklanan anonim işlevler.
Sal

1
"Sadece nitpicking" cevabının önemli olmadığını ve bir dilin inceliklerini anlamanın değerli bir amaç olmadığını ima eder.
user229044

CoffeeScript'e benzer şekilde bakabilirim: bir yapıcı foo = ->iken class Foo, sadece düz eski bir işlev . foo = ->Kesinlikle anonim olarak adlandırılması için hiçbir neden göremiyorum .
Sal

Yanıtlar:


20

CoffeeScript kaçınılmaz olarak JavaScript'e bağlıdır ve JavaScript aşağıdaki ifadeler arasında ayrım yapar:

function foo() { ... }
var foo = function () { ... }

Aslında, şunları bile yazabilirsiniz:

var foo = function bar () { ... }

Bu fark JavaScript'te önemli olduğundan, CoffeeScript hakkında konuşurken aynı terimleri kullanmak mantıklıdır. Ancak, CoffeeScript function foo ()sözdizimi gibi hiçbir şeyi desteklemediğinden , "adlandırılmış" işlevlere sahip olmadığını söyleyebiliriz.

Bir anlamda ad, function foo() { ... }içindeki diğer işlevlerde yalnızca bir işlev oluşturup bir değişkene atadığınız işlev tanımının bir parçasıdır . Bu, örneğin nameişlevlerin (standart dışı) özelliğine yansır : ilk durumda foo.namesize verecek "foo"ve ikincisinde size verecektir "".

Ek olarak, JavaScript'te, bunlar kapsama nasıl tanıtıldıkları açısından da farklılık gösterir: ilk sürüm "kaldırılır" ve ikinci tanımın ancak atandıktan sonra kullanılabildiği kapsamı boyunca kullanılabilir.

Temel olarak, bunu CoffeeScript'e aktarılan JavaScript'e özgü jargon olarak düşünün çünkü CoffeeScript JS ile çok yakından ilgilidir.


1
Böyle bir şey olmadığı doğrudur function foo () {}. Ancak, yine de classyapı üzerinden adlandırılmış bir işlevi başlatabilirsiniz . Derlenmiş CoffeeScript'in (sonuçta ortaya çıkan JavaScript) çoğunun adlandırılmış bir işlevi nasıl yazacağından çok daha ayrıntılı olması.
Sal

1
Ve ayrıca, teknik bir uyarı var: fooişlevinizin gövdesi kaldırılmayacak.
Sal

1
jelivs: sorun değil. Cevabınıza yazdığım son yorumdan bir düzeltme: class foofonksiyonunuzun gövdesi dosyanın üst kısmına kaldırılmayacak.
Sal

CoffeeScript adlandırılmış ve anonim işlevler arasında ayrım yapmadığından, terminolojinin CoffeeScript'e aktarıldığını söyleyebilir miyiz? Javascript'in ayrımı o dilde hiçbir şey ifade etmiyor.
Winston Ewert

@WinstonEwert: CoffeeScript JavaScript'e çok yakın olduğu için önemli. Sonuçta, "altın kural": "Bu sadece JavaScript" .
Tikhon Jelvis

5

Kullanıcının, "anonim bir işlevi adlandırılmış bir işleve" dönüştürdüğünü açıkça belirtmekte fayda var; her iki terim de güçlü, mevcut anlamları ve özellikle de JavaScript dünyasında farklı işlevlere sahip. Mevcut anlam göz önüne alındığında, böyle bir şey yapmıyorlardı ve ben bunu işaret ettim.

CoffeeScript, JavaScript'ten şu ana kadar kaldırılmadı, her ikisinin de paylaştıkları terimleri tek bir dilde başka bir anlamla yeniden tanımlamanız gerekir. CoffeeScript, C ++ 'ın Assembly'den ayrıldığını iddia edebileceğiniz şekilde JavaScript uygulamasından kaldırılan bir balonda mevcut değildir. Anonim işlev ile adlandırılmış işlev arasındaki farkı bilmek önemlidir , çünkü "adlandırılmış" CoffeeScript işlevinizin gerçek adlandırılmış işlev gibi davranmasını beklerseniz hayal kırıklığına uğrayacaksınız:

doStuff() # I cause an error

# ... later

doStuff = (x,y) ->
  alert("Were I actually a named function, this would work!")

Eşdeğer JavaScript, gerçek adlandırılmış bir işlevle iyi çalışır:

doStuff(); // I work just fine!

// later....

function doStuff() {
  alert("I'm a real named function!")
}

Sadece "nitpicking" olduğum konusunda haklı olabilirsin, ama ne olacak? Bilgisayarda ince noktalar programlama madde ve varlık "teknik" Doğru önemlidir. İşe yarayan kod yazma ile aslında kodunuzun neden doğru olduğunu anlama arasındaki farktır .


1
Örneğin, örneğin Python'da denediysem, yine de işe yaramaz. Bu yüzden adlandırılmış vs anonim fonksiyonları ile ilgisi olduğundan emin değilim.
Winston Ewert

1
@WinstonEwert Güncellememe bakın. Python gerçekten onunla hiçbir ilgisi yok ...
user229044

Meager, benim açımdan, isimlendirilmiş işlevlerin Javascript'te yapsalar da, bu şekilde hareket etmeleri gerekmez. Bu nedenle, kaldırma işlemi, CoffeeScript işlevlerinin adlandırılmış olarak değerlendirilmesini diskalifiye etmez.
Winston Ewert

Evet, CoffeeScript'teki tüm işlevlerin anonim olduğunu anlamalısınız (aslında, hepsinin işlev ifadesi olduğunu söylemeyi tercih ederim). Ancak bu, bazen terminoloji ile biraz gevşek olamayacağımız anlamına gelmez. Bu yüzden onlara hiçbir zaman adlandırılmış işlevler diyemeyeceğiniz konusunda ısrarcı olduğunu düşünüyorum.
Winston Ewert

3

Bunun isimlendirilmiş bir işlev olmadığını ısrarla nitelendirmek için öğle yemeğine mi çıkıyorum?

Hayır. Sonuçta, anlambilim açısından, işlev referansınız bir değişken adı ile başvurabileceğiniz bir değişkende saklanır .


3

Kesinlikle bir nitpick değil, imo. Okunabilirlik için yaygın olarak kullanıyorum:

readfile()
dothis()
dothat()
thistoo()
writefile()

function readfile() {
    ...
}
...

Böylece:

"Coffeescript" de gerçek adlandırılmış işlev

hello()

`function hello() {`
console.log 'hello'
dothings()
`}`

Backtick ile saf JS'den kaçıyorsunuz

İşlev gövdesine girintilemeyeceğinizi unutmayın.

Şerefe


1

Pedallarla tartışarak zaman kaybetmeyin. Asla verimli olmaz. Evet, herkes teknik olarak yanlış olsa bile CoffeeScript'teki "adlandırılmış işlev" ile ne demek istediğinizi biliyor. Hayır, teknik olarak yanlış fakat yaygın olarak anlaşılan terminolojinin, önerilen çözümün doğruluğu veya yanlışlığı üzerinde bir etkisi yoktur. İfadenin garipliğini kazanmadan daha kesin olmak mümkün mü? Muhtemelen değil. Ancak bu, insanların kaymasına izin vereceği anlamına gelmez. Sadece bu adamı konuşmanın diğer ucunda hayal edin .

Teknik olarak yanlış olmasının nedeni, işlevi adlandırmamanız, işleve bir başvuru belirtmenizdir. Düşünmek:

foo = bar = ->
  console.log "What's my name?"

İşlevin adı nedir? foove barher ikisi de aynı işleve başvuruyor, ancak farklı adları var. Ayrıca, her iki fooya da barfonksiyonu üzerinde değişiklik yapmadan, tamamen farklı bir işlev ya da farklı bir tür başvurmak için herhangi bir zamanda yeniden edilebilir.


0

Yani, bunu okuma şeklim şöyle:

Kullanarak JavaScript konsolunda bir işlev bildirdiğinizde

var foo = function() { ... }

ve sonra fooparantez olmadan çağırırsanız,

function() { ... }

Ancak, şunu kullanarak tanımlarsanız

function foo() { ... }

ve sonra fooparantez olmadan tekrar çağırırsanız,

function foo() { ... }

İlk durumda, içinde anonim bir işlev saklayan "foo" adlı bir değişken bildirdiğinizi söyleyebilirim. İkinci durumda, aslında "foo" adında bir işlev bildirdiğinizi söyleyebilirim.

CoffeeScript ilk kalıbı kullandığından, CoffeeScript işlevlerinin tümünün anonim işlevler olarak adlandırılmış değişkenlerde saklanmasının teknik olarak doğru olduğunu kabul ediyorum.

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.