1. geriye uyumluluk
JavaScript, ECMAScript'in bir uygulamasıdır . Bu işlevlerin çoğu ECMAScript 5 (ES5) 'te tanıtıldı, ancak hala pazarda önemli bir paya sahip olan birçok eski tarayıcı bu işlevleri desteklemiyor (bkz. ECMAScript 5 uyumluluk tablosu ), bunlardan en önemlisi IE8'dir.
Genel olarak kütüphaneler, eğer kendi polyfilllerini kullanıyorlarsa mevcutsa, yerel uygulamaya geri dönecektir, örneğin, AngularJS'in uygulamasına bakalım ( angular.js L203-257 ):
function forEach(obj, iterator, context) {
var key;
if (obj) {
if (isFunction(obj)){
for (key in obj) {
// Need to check if hasOwnProperty exists,
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
iterator.call(context, obj[key], key);
}
}
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
}
return obj;
}
Aşağıdaki satırlar, forEach
yöntemin nesne üzerinde olup olmadığını ve AngularJS sürümü olup olmadığını kontrol eder. Değilse, önceden belirlenmiş işlevi kullanır (yerel sürüm):
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
}
2. Kolaylık
Yerel JavaScript'te Array.prototype.forEach
, bir örneğe özgü bir yöntemdir Array
, ancak çoğu Object
da yinelenebilir.
Bu nedenle birçok kütüphane yaratıcısı işlevlerini polimorfik yapar (giriş olarak çoklu türleri kabul edebilir). Yukarıdaki AngularJS kodunu alalım ve hangi girdileri kabul ettiğini görelim:
İşlevler :
if (isFunction(obj)){
for (key in obj) {
// Need to check if hasOwnProperty exists,
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
iterator.call(context, obj[key], key);
}
}
Diziler (yerel forEach desteği ile):
} else if (obj.forEach && obj.forEach !== forEach) {
obj.forEach(iterator, context);
Array (yerel forEach desteği olmadan), String, HTMLElement, Geçerli bir uzunluk özelliğine sahip nesne de dahil olmak üzere dizi benzeri nesneler :
} else if (isArrayLike(obj)) {
for (key = 0; key < obj.length; key++)
iterator.call(context, obj[key], key);
Nesneler:
} else {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
}
Sonuç
Gördüğünüz gibi AngularJS, herhangi bir JavaScript Nesnesinin çoğunu yineleyecektir, ancak yerel işlevle aynı şekilde çalışsa da, çok daha farklı türde girdiler kabul etse de, ES5 işlevlerini getirmenin yanı sıra kitaplığa geçerli bir eklemedir eski tarayıcılara.