ES6'nın neden ince ok işlevleri yok?


16

ES6 normal işlevlerden iki büyük farkı olan yağ-ok işlevleri ( =>) ekledi :

  • daha kısa sözdizimi (tek ifade gövdesi kullanıyorsanız örtük dönüş dahil)
  • thisçevreleyen kapsamdan miras almak

Bunların her ikisi de çok kullanışlı özelliklerdir, ancak bana değer ve uygulamalarında tamamen ayrı görünüyorlar - bazen birini ya da diğerini ya da her ikisini ya da hiçbirini istemiyorum. Ben kısa sözdizimi işlevini kullanmak istiyorsanız, bunu tuhaf var da kullanımı this-modifying davranışı. Ve tam tersi. Bu iki özelliğin neden dile tek bir ek olarak uygulandığını anlamıyorum.

Örtük dönüşü ve kısalığı için kısa bir sözdizimi işlevi kullanmak istersem (tam function (..) { return ...}olarak biraz daha az okunabilir bazı bağlamlarda ), ancak işlevimde thisçağıran içeriğe başvurmak için kullanmak istiyorum ? Bunu yapmanın bir yolu yok.

CoffeeScript hem sahiptir ->ve =>stil fonksiyonları ve görünüşe ES6 ödünç =>oradan tarzı. Benim sorum şu ki, neden ES6 ->stili ödünç almadı ?


yağ-ok işlevlerinin de farklılıkları vardır, çünkü bunlar da bağlanamazlar arguments.
DeadMG

Bazen istediğiniz tek şey çevredeki kapsam ise, her zaman thistam işlev bildiriminde kapatmaya bağlanabilirsiniz . Bu, endişe duyduğunuz kısım olmayabilir.
Ben

Yanıtlar:


25

Ok işlevleri ekleme teklifine bakın: http://wiki.ecmascript.org/doku.php?id=harmony:arrow_function_syntax 1

Ne diyor:

Bununla birlikte, CoffeeScript'leri istemiyoruz ->, iki ok olması kafa karıştırıcı ve dinamik olan bu bağlama genellikle ateşli bir tabanca.

Ayrıca, teklifin -> sözdizimine sahip önceki bir sürümü hakkında da tartışmalar görebilirsiniz: https://esdiscuss.org/topic/arrow-function-syntax-simplified

Aşağıdakilere iniyor gibi görünüyor:

  1. Oldukça farklı anlambilime sahip iki ok sözdizimine sahip olmak, karmaşıklığı ve karışıklığı artıracaktır.
  2. Dinamik bu fonksiyon () bağlanması ve ->nadiren yararlı kabul edildi ve bir tabanca.
  3. Bu bağlamaya gerçekten dinamik ihtiyacınız varsa, hala bir kısayol sözdizimine sahip olmanın çok yararlı olmadığı function () işlevini kullanabilirsiniz.

1
+1. ES6'nın başlangıçta ES4'e dahil edilmesi planlanan bu özellikleri tanıtmaya yönelik ikinci girişim olduğunu özellikle belirtmek isteriz, ancak önemli paydaşların çok karmaşık ve geriye dönük uyumluluğu kırması muhtemel olduğu anlaşıldığında spesifikasyondan vazgeçildi. Her şeyi mümkün olduğunca basit tutmak, komite için bu kez önemli bir hedef olmalı.
Jules

1
Cevabınız için teşekkürler, ama bunu kapsadığını düşünmüyorum. Daha azı daha basit anlamına gelmez; Ben sadece farklı bu bağlayıcı mantık (tek bir karakter değiştirme ile karşılaştırıldığında) elde etmek için iki çok farklı fonksiyon sözdizimi arasında geçiş yapmak zorunda daha karmaşık olduğunu iddia ediyorum. "Değişken semantiğe sahip birden fazla işlev türüne" sahip olmak korkunç bir fikir değildir; aslında bizim sahip olduğumuz şey budur. Ve bahsettiğimiz herhangi bir şeyle geriye dönük uyumluluğun ne yaptığını görmüyorum. Demek istediğin buysa, klasik işlev sözdizimi desteğini kaldırmaları gerektiğini
söylemiyorum

2
@callum, fikir birliği (en azından bu kararı veren insanlar arasında), function()bu bağlamanın bir hata olduğu ve dil üzerinde bir siğil olduğudur. Eğer yapabilirlerse, anlambilime function()sahip olacaklardı =>, ama yapamazlar çünkü bu geriye dönük uyumluluğu bozar.
Winston Ewert

2
@WinstonEwert bekle, karar veren kişilerin , çevredeki kapsamdan function()miras thisalmak için değişebilselerdi tercih edeceğini mi söylüyorsunuz =>? Bu durumda, thissadece her yerde küresel nesneyi ifade etmeyecek miydi? Kulağa garip geliyor. Bunu nereden duydun?
Callum

3
Bunun kabul edilmiş bir cevabı olabilir, ancak zayıf dil tasarımı gibi görünüyor. Şişman ok gerektiren bir diliniz varsa, ince bir ok da mevcut olmalıdır. Birincisi herkesi nesneler açısından düşünmeye başlamaya zorlarken, ikincisi javascriptlerin önce işlevsel tasarım tarihini ve ertelenmiş bağlamı kabul eder.
Çekirdek
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.