SORU
17 NİSAN 2013, ÇARŞAMBA


Nedir [].dosyalarda grup.() çağrısı JavaScript?

Bazı kod parçacıkları bakıyordum ve birden fazla eleman bir dosyalarda grup için boş bir dizi için uygulanan düğüm bir liste üzerinde bir işlev çağrısında bulundu.

Örneğin gibi bir şey var:

[].forEach.call( document.querySelectorAll('a'), function(el) {
   // whatever with the current node
});

ama nasıl çalıştığını anlayamıyorum. Kimse bana bu dosyalarda grup için ön ve nasıl call eserlerinde boş dizi davranışlarını açıklayabilir mi?

CEVAP
17 NİSAN 2013, ÇARŞAMBA


[] bir dizidir.
Bu dizi hiç kullanılmıyor.

Bir dizi kullanarak dizi prototip erişim, .forEach gibi verir çünkü sayfada koymak ediliyor.

Bu Array.prototype.forEach.call(...); yazarak daha hızlı

Sonraki, forEach Bir giriş olarak işlev alan bir fonksiyon

[1,2,3].forEach(function (num) { console.log(num); });

...ve her öğe this (this dizi gibi, o bir length ve erişebilirsiniz parçaları gibi this[1]) bu da geçer üç şey:

  1. dizideki eleman
  2. öğe (üçüncü öğe 2 geçecekti) dizin
  3. dizi için bir referans

Son olarak, .call fonksiyonları olan bir prototip (diğer işlevler üzerine çağrılan bir işlevi yoktur).
.call alacak ilk bağımsız değişken ve değiştir this içinde normal işlevi ile ne yaparsan geçti call, ilk bağımsız değişken (undefined null window günlük JS, ya da olacak ne olursa olsun geçtin, eğer "sıkı modu"). Bağımsız kalan orijinal işlevi geçirilecek.

[1, 2, 3].forEach.call(["a", "b", "c"], function (item, i, arr) {
    console.log(i   ": "   item);
});
// 0: "a"
// 1: "b"
// 2: "c"

Bu nedenle, yaratan sensin hızlı bir şekilde arama forEach işlev ve konum değiştirme this gelen boş bir dizi için bir liste <a> etiketleri ve her <a> sipariş, arama fonksiyonu sağladı.

EDİT

Temizleme . Mantıksal Sonuç /

Aşağıda, bir makalede, bu çözüm hack-ish ve çirkin olduğu için fonksiyonel programlama girişimleri biz hurda ve kılavuzu, satır içi döngü, her zaman, sadık düşündüren bir bağlantı var.

Bence bu süre .forEach daha az yararlı daha muadilleri, .map(transformer), .filter(predicate), .reduce(combiner, initialValue), hala hizmet amaçlı zaman gerçekten yapmak istediğin şey ise değiştir dışarıdaki dünya (dizi), n-kez, süre erişmek zorunda da arr[i] i.

Peki nasıl başa çıkacağız eşitsizlik, olarak Düsturu açıkça bir yetenekli ve bilgili bir adam, ve ben gibi hayal edin ben ne yaptığımı biliyorum/nereye gidiyorum (şimdi ve sonra... ...diğer zamanlarda baş-ilk öğrenme)?

Cevap aslında oldukça basit ve bir Amca Bob ve Sir Crockford hem facepalm, gözetim nedeniyle:

o kadar temiz.

function toArray (arrLike) { // or asArray(), or array(), or *whatever*
  return [].slice.call(arrLike);
}

var checked = toArray(checkboxes).filter(isChecked);
checked.forEach(listValues);

Eğer bunu yapmak için ihtiyacınız olup olmadığını sorguluyorsun şimdi, Eğer, kendini, cevap hayır olabilir...
Bu kesin bir şey... ...her(?) üst düzey kütüphane bu gün vardır.
Eğer lodash veya hatta bir WordPress kullanmak çizgi kullanıyorsanız, öğeleri kümesi almak ve bir eylem n kat performanslı bir şekilde yapması gerekiyor.
Eğer böyle bir şey kullanarak değilse, o zaman mutlaka, kendi yazmak.

lib.array = (arrLike, start, end) => [].slice.call(arrLike, start, end);
lib.extend = function (subject) {
  var others = lib.array(arguments, 1);
  return others.reduce(appendKeys, subject);
};

ES6(ES2015) ve Ötesi için güncelleme

Sadece bir slice( )/array( )/vb yardımcı yöntem yapacak daha kolay bir hayat için insanlar kim istemek kullanım listeleri gibi kullanıyorlar diziler (olarak), ama kişilerin sahip lüks çalışma ES6 tarayıcıların nispeten-yakın gelecekte, ya da "transpiling" Babil bugün, sen dil özellikleri yerleşik olan bu tür şeyler gereksiz.

function countArgs (...allArgs) {
  return allArgs.length;
}

function logArgs (...allArgs) {
  return allArgs.forEach(arg => console.log(arg));
}

function extend (subject, ...others) { /* return ... */ }


var nodeArray = [ ...nodeList1, ...nodeList2 ];

Süper temiz ve çok kullanışlı.
BakDinlenmeveYayıldıoperatörler; onları BabelJS sitesinde deneyin; eğer teknoloji yığını sırada ise, Babil ve inşa bir adım üretim için bunları kullanın.


Diziye olmayan diziden dönüşüm kullanabilmek için iyi bir neden yok... ...sadece kodunuzu berbat bir şey yapmaya zorlamayınamaaynı çirkin çizgi yapıştırma, her yerde.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • FPSRussia

    FPSRussia

    19 NİSAN 2010
  • Kyletiv7

    Kyletiv7

    28 Mayıs 2007