Prototip devralma
null
ve undefined
hariç her temel veri türünün bir
prototype, düzgün şekilde işleme yöntemleri sağlayan ve karşılık gelen nesne sarmalayıcı
değer katar. Bir temel öğede bir yöntem veya özellik arama çağrıldığında,
JavaScript, arka planda ilk bileşeni sarmalar ve
özellik aramasını sarmalayıcı nesnesinde gerçekleştirir.
Örneğin, bir dize değişmez değerinin kendi yöntemi yoktur, ancak
Karşılık gelen String
nesnesi sayesinde .toUpperCase()
yöntemi
sarmalayıcı:
"this is a string literal".toUpperCase();
> THIS IS A STRING LITERAL
Buna prototip devralma (özellik ve yöntemlerin devralınması) denir. oluşturabilirsiniz.
Number.prototype
> Number { 0 }
> constructor: function Number()
> toExponential: function toExponential()
> toFixed: function toFixed()
> toLocaleString: function toLocaleString()
> toPrecision: function toPrecision()
> toString: function toString()
> valueOf: function valueOf()
> <prototype>: Object { … }
Yalnızca tanımlamak yerine bu oluşturucuları kullanarak temel öğeler oluşturabilirsiniz
değerlerine göre sıralayabilirsiniz. Örneğin, String
oluşturucusu kullanıldığında
dize nesnesi, bir dize sabit değeri değil: yalnızca dizemizi içermeyen bir nesne
değeri ancak kurucunun devralınan tüm özellikleri ve yöntemleridir.
const myString = new String( "I'm a string." );
myString;
> String { "I'm a string." }
typeof myString;
> "object"
myString.valueOf();
> "I'm a string."
Çoğunlukla, sonuç olarak elde edilen nesneler, daha iyi performans göstermek için
tanımlamanız gerekir. Örneğin,
new Number
oluşturucusu, tüm yöntemleri içeren bir nesneyle sonuçlanır ve
özellikleri kullanmak için Number
prototipini ayarlamak üzere
bu nesneleri tamsayılarda
vardığınız gibi kullanabilirsiniz:
const numberOne = new Number(1);
const numberTwo = new Number(2);
numberOne;
> Number { 1 }
typeof numberOne;
> "object"
numberTwo;
> Number { 2 }
typeof numberTwo;
> "object"
numberOne + numberTwo;
> 3
JavaScript'in yerleşik olarak bulunduğu için bu oluşturuculara prototip kalıtım ise hiçbir pratik fayda sağlamaz. Oluşturuluyor oluşturucuları kullanan temel öğeler de beklenmedik sonuçlara yol açabilir, çünkü sonuç basit bir değişmez değer değil, nesnedir:
let stringLiteral = "String literal."
typeof stringLiteral;
> "string"
let stringObject = new String( "String object." );
stringObject
> "object"
Bu, katı karşılaştırma operatörlerinin kullanımını karmaşık hale getirebilir:
const myStringLiteral = "My string";
const myStringObject = new String( "My string" );
myStringLiteral === "My string";
> true
myStringObject === "My string";
> false
Otomatik noktalı virgül ekleme (ASI)
JavaScript yorumcuları, bir komut dosyasını ayrıştırırken atlanan örnekleri düzeltmeye çalışmak için otomatik noktalı virgül ekleme (ASI) noktalı virgül. JavaScript ayrıştırıcı, izin verilmeyen bir jetonla karşılaşırsa olası söz dizimi hatasını düzeltmek için jetondan önce bir noktalı virgül eklemeye çalışır. aşağıdaki koşullardan biri veya daha fazlası geçerli olduğu sürece:
- Bu jeton, önceki jetondan bir satır sonuyla ayrılır.
- Jeton
}
. - Önceki jeton
)
ve eklenen noktalı virgül son nokta olurdo
...while
ifadesinin noktalı virgülü.
Daha fazla bilgi için ASI kurallarına bakın.
Örneğin, aşağıdaki ifadelerden sonra noktalı virgüllerin atlanması, söz dizimi hatası:
const myVariable = 2
myVariable + 3
> 5
Ancak ASI, aynı satırdaki birden fazla ifadeyi hesaba katamaz. Şu durumda: aynı satıra birden fazla ifade yazacağınızdan emin olun. Bunları noktalı virgüller:
const myVariable = 2 myVariable + 3
> Uncaught SyntaxError: unexpected token: identifier
const myVariable = 2; myVariable + 3;
> 5
ASI, oluşturulan bir tür söz dizimsel esneklik değil, hata düzeltme girişimidir. JavaScript'e aktarıldığından emin olun. Fazlalıklardan kaçınmanız için uygun yerlerde noktalı virgül kullanın. kod yazmanızı ister.
Yüksek güvenlik modu
JavaScript'in nasıl yazıldığını belirleyen standartlar zaman içinde çok daha Dilin ilk tasarımında düşünülen her şey. JavaScript'in beklenen davranışı, eski web sitelerinde hatalara neden olmamalıdır.
ES5, herhangi bir güncelleme olmadan JavaScript anlamları ile ilgili
"katı modu"nu kullanıma sunarak mevcut uygulamaları kırma, iletişim kurmanın
bir komut dosyasının tamamı veya bir programlama dili için daha kısıtlayıcı bir dil
bağımsız işlev. Yüksek düzey modunu etkinleştirmek için düz dize değerini kullanın
"use strict"
ve ardından noktalı virgül gelir.
işlev:
"use strict";
function myFunction() {
"use strict";
}
Yüksek düzey modu, bazı "güvenli olmayan" durumları engeller eylemler veya desteği sonlandırılmış özellikler,
yaygın "sessiz" ifadesinin yerine açıkça görünen hatalar olduğunu ve bunların
çakışmalarını önleyen söz dizimleri içerir. Örneğin, ekip üyeleri
değişken kapsam çerçevesinde tasarım kararları
geliştiricilerin yanlışlıkla "kirliliğe" neden olma olasılığını global kapsamı
bağlamdan bağımsız olarak bir değişken tanımlamak,
var
anahtar kelime:
(function() {
mySloppyGlobal = true;
}());
mySloppyGlobal;
> true
Modern JavaScript çalışma zamanları, (bilerek veya isteyerek) bir web sitesini bozamaz. Bunun yerine, modern JavaScript, geliştiricilerin katı kurallı yüksek düzey modu varsayılan olarak yalnızca şu durumlarda etkinleştirin: eski uygulamaları bozmayacakları yeni dil özellikleri:
(function() {
"use strict";
mySloppyGlobal = true;
}());
> Uncaught ReferenceError: assignment to undeclared variable mySloppyGlobal
"use strict"
öğesini
dize değişmez değeri.
Şablon değişmez değeri
(use strict
) çalışmaz. Herhangi bir tarihten önce "use strict"
belirtilen bağlamda yürütülebilir bir kod yazmaktır. Aksi takdirde, çevirmen bunu yoksayar.
(function() {
"use strict";
let myVariable = "String.";
console.log( myVariable );
sloppyGlobal = true;
}());
> "String."
> Uncaught ReferenceError: assignment to undeclared variable sloppyGlobal
(function() {
let myVariable = "String.";
"use strict";
console.log( myVariable );
sloppyGlobal = true;
}());
> "String." // Because there was code prior to "use strict", this variable still pollutes the global scope
Referansa göre, değere göre
Bir nesnenin özellikleri dahil olmak üzere, işlev parametrelerini ve dizi, set veya harita, temel bir öğe içerebilir veya referans değeri kullanabilirsiniz.
Bir değişkenden diğerine temel bir değer atandığında, JavaScript motor, bu değerin bir kopyasını oluşturur ve bunu değişkene atar.
Bir yeni bir kopyasını oluşturmak yerine değişkene ait bir nesnenin bellekte depolanan konumuna dönüştürülür. Bu nedenle, bir değişkenin başvuruda bulunduğu bir nesne yalnızca değil, başvurulan nesneyi söz konusu değişkenin içerdiği bir değerdir. Örneğin, değişkenini nesne referansı içeren bir değişkenle değiştirin, daha sonra değişkenine değer eklendiğinde, özellik ve değeri eklenir. orijinal nesneye geri yükleyin:
const myObject = {};
const myObjectReference = myObject;
myObjectReference.myProperty = true;
myObject;
> Object { myProperty: true }
Bu, yalnızca nesneleri değiştirmek için değil, aynı zamanda katı kurallı performanslar için de
kesin bir eşitlik sağlamak için her iki değişkeni de
true
olarak değerlendirmek için aynı nesneye başvuruda bulunun. Referans gösteremezler
farklı nesneler (bu nesneler yapısal olarak aynı olsa bile):
const myObject = {};
const myReferencedObject = myObject;
const myNewObject = {};
myObject === myNewObject;
> false
myObject === myReferencedObject;
> true
Bellek ayırma
JavaScript otomatik bellek yönetimi kullanır. Bu da, belleğin geliştirme sürecinde açıkça tahsis edilmemeli veya tahsis edilmemelidir. Bu sırada JavaScript motorlarının ayrıntılarını veya hafıza yönetimi yaklaşımlarının belleğin nasıl ayrıldığını anlamak, bu modülün kapsamında referans değerlerle çalışma hakkında bilgi edineceksiniz.
İki "alan" vardır bellekte: "yığın" "yığın"tan oluşur. Yığın mağazalar ilkel değerler ve nesne referansları gibi statik veriler içerir. Çünkü Bu verileri saklamak için gereken sabit bir alan, komut dosyası yürütülür. Yığın, dinamik olarak ayrılmış alan gerektiren nesneleri depolar çünkü yürütme sırasında boyutları değişebilir. Bellek, bir işlem tarafından serbest bırakılır "çöp toplama” adı verilen Bu işlem, referansı olmayan nesneleri yer alır.
Ana iş parçacığı
JavaScript, temelde tek iş parçacıklı bir dildir ve "eşzamanlı" yürütme modelidir, yani yalnızca bir görev yürütebilir. oluşturabilirsiniz. Bu sıralı yürütme bağlamı, ana iş parçacığı olarak adlandırılır.
Ana iş parçacığı HTML ayrıştırma gibi diğer tarayıcı görevleri tarafından paylaşılır. sayfanın bölümlerini oluşturup yeniden oluşturma, CSS animasyonlarını çalıştırma ve e-posta yönlendirme gibi basit işlemlerden (ör. metin vurgulama) karmaşık (form öğeleriyle etkileşim gibi) Tarayıcı satıcıları bulundu ana iş parçacığı tarafından gerçekleştirilen ancak daha karmaşık olan görevleri optimize etmenin yollarını komut dosyaları, ana iş parçacığının kaynaklarının çok büyük bir kısmını kullanmaya devam edebilir ve sayfa performansı.
Bazı görevler Web Çalışanları adı verilen arka plan ileti dizileri, bazı kısıtlamalara tabidir:
- Çalışma iş parçacıkları yalnızca bağımsız JavaScript dosyaları üzerinde işlem yapabilir.
- Tarayıcı penceresine ve kullanıcı arayüzüne erişim önemli ölçüde azalır veya hiç yoktur.
- Bunların, ana ileti dizisiyle iletişim kurma konusunda kısıtlı bilgi vardır.
Bu kısıtlamalar onları belirli bir noktaya odaklanan, yoğun kaynak gerektiren görevler için ana iş parçacığını işgal edebilir.
Çağrı yığını
"Yürütme bağlamlarını" yönetmek için kullanılan veri yapısı; çalıştırılan kod çağrı yığını adı verilen bir listedir (genellikle yalnızca "grup"). Bir komut dosyası ilk kez yürütüldüğünde, JavaScript yorumlayıcısı "global yürütme bağlamı" oluşturur çağrı yığınına gönderir ve deyimler yukarıdan aşağıya doğru tek tek yürütülen, tıklayın. Çevirmen, bir "işlev yürütme bağlamı" sağlar Arkadaş Bitkiler projesine yığının üstünde, genel yürütme bağlamını duraklatır ve işlevi yürütür daha yakından inceleyeceğiz.
Bir işlev her çağrıldığında, o çağrıya ait işlev yürütme bağlamı mevcut yürütme bağlamının hemen üzerinde, yığının en üstüne aktarıldı. Çağrı yığını "ilk gelen, ilk çıkar" prensibiyle çalışır yani en önemlisinin Yığındaki en yüksek olan son işlev çağrısı yürütülür ve devam eder sorun çözülene kadar bekleyin. Bu fonksiyon tamamlandığında çevirmen, işlevi kaldırır. bu işlev çağrısını içeren yürütme bağlamı, tekrar yığındaki en yüksek öğe haline gelir ve yürütmeye devam eder.
Bu yürütme bağlamları, yürütülmesi için gereken tüm değerleri yakalar. Onlar
aynı zamanda da
işlevini yerine getirir ve kullanıcının bağlamına göre
İşlev bağlamında this
anahtar kelimesi.
Etkinlik döngüsü ve geri çağırma sırası
Bu sıralı yürütme, geri çağırma içeren eşzamansız görevlerin
sunucudan veri getirme, kullanıcı etkileşimine yanıt verme ve
veya setTimeout
ya da setInterval
ile ayarlanmış zamanlayıcıların beklenmesi
ya da beklenmedik bir şekilde
geri çağırma işlevinin yürütme bağlamı olduğu andaki mevcut yürütme bağlamı
emin olun. Bu sorunu çözmek için JavaScript, eşzamansız görevleri yönetir
etkinliğe dayalı bir "eşzamanlılık modeli" kullanarak "etkinlik döngüsünden" ve
"geri çağırma sırası" (bazen "ileti sırası" olarak da adlandırılır).
Ana iş parçacığında eşzamansız bir görev yürütüldüğünde geri çağırma, işlevin yürütme bağlamı, çağrı yığını. Olay döngüsü, bazen reactor, çağrı yığınının ve geri arama sırasının durumunu yoklar. Programda geri çağırma sırası ve etkinlik döngüsü, çağrı yığınının boş olduğunu belirler geri çağırma kuyruğundaki görevler, yüklenerek yürütüldü.