SORU
8 NİSAN 2014, Salı


Ne zaman ECMA 6 Ok fonksiyonları kullanmalıyım?

Soru gelecek ECMA 6 (Uyum) kapsamında kod tarzı hakkında bir şey yaptınız ve zaten dili ile çalışmış insanlara yöneliktir.

() => {} function () {} ES6 fonksiyonları yazmak için çok benzer iki yol alıyoruz. Diğer dillerde lambda fonksiyonları genellikle anonim kalarak kendilerini ayırt, ama ECMA herhangi bir işlevi anonim olabilir. Her iki tip farklı kullanım alanları (this ya da açıkça bağlı veya açık olarak bağlı değil gerektiğinde yani). Bu etki alanları arasında iki gösterim yapacak vakaların büyük bir numarası vardır.

ES6 ok fonksiyonları en az iki sınırlamaları vardır:

  • new çalışmazlar
  • Sabit this hazırlama kapsama bağlı

Bu iki sınırlama bir yana, ok fonksiyonları teorik olarak normal işlevlerini hemen hemen her yerde yerini alabilir. Doğru yaklaşım pratikte ne kullanıyorsun? Fonksiyonlar örneğin kullanılan ok:

  • "her yerde iş", yani her yerde bir fonksiyonu this değişken konusunda agnostik olmak zorunda değildir ve bir nesne oluşturuyoruz.
  • "onlar her yerde belirli bir kapsam bağlı olması gereken", yani olay dinleyicileri, zaman aşımı,. yalnızca gerektiğinde
  • 'kısa' işlevleri, ama 'uzun' fonksiyonları ile
  • başka bir ok fonksiyon içeren işlevleri ile sadece

Ne arıyorum ECMA gelecek sürümünde uygun bir işlev gösterim seçme için bir kılavuz. Kılavuz gerekecektir net olması öğrettiği için geliştiriciler bir ekip ve tutarlı olmak bunu gerektirmez sürekli yeniden düzenleme bir ileri bir geri, bir işlevi gösterimi için bir başka.

CEVAP
13 NİSAN 2014, Pazar


Bir süre önce bizim takım bütün kod (orta boy AngularJS uygulama) kullanarak derlenmiş JavaScript göç etmiştirTraceurBabel. ES6 fonksiyonları için başparmak aşağıdaki kuralı kullanarak şimdi ve ötesi: benim

  • Object.prototype özellikleri için genel kapsamda ve function kullanın.
  • Nesne kurucular class kullanın.
  • => her yerde.

Neden hemen hemen her yerde ok işlevleri kullanmak?

  1. Kapsam güvenlik: ok fonksiyonları sürekli kullanıldığında, her şeyi köküne kadar 15 ** aynı garantilidir. Varsa bile, tek bir standart işlevi, bir geri arama ok fonksiyonları bir grup ile karışık ise kapsam berbat olacak bir şans var.
  2. Sıklık: Ok işlevleri daha kolay okumak ve yazmak için. (Bu birkaç örnek daha vermek) ben o kadar inatçı görünebilir.
  3. Açıklık: neredeyse her bir ok fonksiyonu, function hemen kapsamını tanımlamak için sopa herhangi bir düzenli. Geliştirici her zaman thisObject ne olduğunu görmek için bir sonraki daha yüksek function deyimi bakabilirsiniz.

Neden hep genel kapsamlı veya modül kapsamında normal işlevlerini kullanmak?

  1. thisObject erişim sağlayan bir işlev gösterir.
  2. window nesne (genel kapsamlı) en iyi açıkça ele alınmaktadır.
  3. Object.prototype birçok tanımlar genel kapsam (String.prototype.truncate sanırım vb.) canlı ve genellikle bu tür function zaten olmak zorunda. Sürekli olarak global kapsam function kullanarak hataları önlemek yardımcı olur.
  4. Genel kapsamda birçok işlevi eski tarz sınıf tanımları için nesne kurucular.
  5. Fonksiyonları adlandırılabilir1. Bu iki avantajı vardır: (1) diğer işlev çağrıları özellikle dışarıdaconst foo = () => {}function foo(){} yazmak için daha az garip. (2) fonksiyon adı izlerini yığını gösterir. Her iç geri adım için sıkıcı olurdu, ancak tüm ortak fonksiyonları adlandırma muhtemelen iyi bir fikirdir.
  6. Fonksiyon bildirimleri statik fonksiyonu yararlı bir özelliği olan, hoisted, (ilan önce erişilebilir anlamına gelir).


Nesne kurucular

Bir ok fonksiyon oluşturmaya çalışırken, bir özel durum atar:

var x = () => {};
new x(); // TypeError: x is not a constructor

Ok fonksiyonları fonksiyonları üzerinde önemli bir avantajı, bu nedenle nesne kurucular çift olarak: işlevleri

function Person(name) {
    this.name = name;
}

Ancak, işlevsel olarak aynı2draft class definition ES Uyumu neredeyse kompakt

class Person {
    constructor(name) {
        this.name = name;
    }
}

Eski gösterimde kullanımı sonunda cesareti olacağını tahmin ediyorum. Nesne oluşturucu gösterimde hala nesneleri programlı olarak oluşturulan, ama pek bir şey yok basit isimsiz nesne fabrikaları için bazıları tarafından kullanılır.

Bir nesne yapıcı olması gereken yukarıda gösterildiği gibi class bir işlevi dönüştürme düşünmelisiniz. Sözdizimi anonim işlevleri/sınıfları ile de çalışır.


Ok fonksiyonları okunabilirlik

Normal işlevlerine bağlı olduğu için muhtemelen en iyi argüman - kapsam güvenlik lanet - ok fonksiyonları normal işlevlerini daha okunabilir olurdu. Eğer kod ilk etapta işlevsel değilse, o zaman ok işlevleri gerekli değildir, ve ok fonksiyonları sürekli kullanılmadığında çirkin görünüyorlar.

ECMA değişti biraz yana ECMA 5.1 verdi bize işlevsel Array.forEach, Array.map ve tüm bunlar fonksiyonel programlama özellikleri var bize kullanmak fonksiyonları için-döngüler olurdu eskiden. Asenkron JavaScript biraz uzaklaştırdı. ES6 da anonim fonksiyonlar anlamına gelir Promise bir nesne, gemi olacak. Geri fonksiyonel programlama gidiş yok. Fonksiyonel JavaScript, ok fonksiyonları normal fonksiyonları üzerinde tercih edilir.

Örneğin, bu (özellikle) kafa karıştırıcı kod parçası3:

function CommentCtrl($scope, articles) {
    $scope.comments = [];

    articles.getList()
        .then((articles) => Promise.all(articles.map((article) => article.comments.getList())))
        .then((commentLists) => {
            $scope.comments = commentLists.reduce((a, b) => a.concat(b));
        });
}

Düzenli fonksiyonları ile kod aynı parça:

function CommentCtrl($scope, articles) {
    $scope.comments = [];

    articles.getList()
        .then(function (articles) {
            return Promise.all(articles.map(function (article) { 
                return article.comments.getList();
            }));
        })
        .then(function (commentLists) {
            $scope.comments = commentLists.reduce(function (a, b) {
                return a.concat(b); 
            });
        });
}

Ok işlevlerden herhangi birini standart bir fonksiyon tarafından değiştirilebilir, ancak bunu yapmak çok kazanmak için çok küçük olacaktır. Hangi sürüm daha okunabilir mi? İlki diyebilirim.

Ok fonksiyonlarını ya da normal işlevlerini kullanmak için olup olmadığını merak ediyorum zamanla daha az alakalı olacak sanırım. Enfonksiyonlarya sınıf yöntemleri olur, uzak function anahtar ile yapmak, ya da sınıflar olacak. Fonksiyonları Object.prototype aktarıyorum sınıflar için kullanımda kalacak. Bu arada bir şey function anahtar kelime saklı öneririm gerçekten sınıf bir yöntem ya da bir sınıf olmalıdır.


Notlar

  1. Ok adında fonksiyonları deferred in the ES6 spec. Yine de, gelecekteki bir sürümüne eklemiş olabilirler.
  2. Taslak şartnameye göre"Sınıf bildirimleri/ifadeler işlevi bildirimleri tam olarak prototip çift/yapıcı bir işlev oluşturmak"sürece bir sınıf extend anahtar kelime kullanmaz. Küçük bir fark sınıf tanımlamalar işlevi bildirimleri edilmez ise sabittir.
  3. Tek deyimi ok fonksiyonları blok not: bir ok fonksiyon yan etkisi yalnız (örneğin atama) denilen yerde bir blok kullanmak istiyorum. Bu şekilde dönüş değeri atılacak açıktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • Keith Anthe

    Keith Anthe

    26 NİSAN 2011
  • USI Events

    USI Events

    6 AĞUSTOS 2013