Ders 02 / 21
Kod Çalıştırma Yolları
Dosyadan çalıştırma, etkileşimli kabuk, tarayıcı konsolu ve betik etiketi; betik ile modül ayrımı ve hata iletisinin okunması.
İçindekiler
Önceki ders, bir betiğin hangi adları görebildiğinin barındıran ortama bağlı olduğunu gösterdi. Bu ders, o ortamlara kodun nasıl verildiğini ele alır: komut satırından bir dosya, etkileşimli bir kabuk oturumu, tarayıcı konsolu ve sayfaya bağlanan bir betik etiketi. Dört yol yalnızca “kodu başlatma” biçimi değildir; her biri kodun hangi kurallar altında yorumlanacağını da belirler.
Aynı ölçüm betiği bu yolların hepsinde çalıştırılacak. Sonuçların örtüştüğü ve ayrıştığı noktalar, dilin çekirdeği ile ortamın katkısı arasındaki sınırı ikinci kez çizer.
Komut Satırından Bir Dosya Çalıştırmak
Sunucu tarafı çalışma zamanı, kaynağı bir dosyadan alır. Kurstaki örnekler node
komutuyla çalıştırılmıştır; dosyaya verilen ad ve uzantı, kaynağın nasıl yorumlanacağını
belirler.
olcum.mjs adlı dosya:
const sicakliklar = [21.5, 19.75, 23, 18.25]; let toplam = 0; for (const deger of sicakliklar) { toplam += deger; } console.log("okuma sayisi:", sicakliklar.length); console.log("ortalama:", toplam / sicakliklar.length);
node olcum.mjs
okuma sayisi: 4 ortalama: 20.625
Dosya baştan sona okunur, ayrıştırılır ve yürütülür. Süreç, kodun son satırı bittikten sonra bekleyen bir iş kalmadıysa sona erer.
Tek satırlık denemeler için dosya açmak gerekmez; kaynak doğrudan argüman olarak verilebilir:
node -e 'console.log(Math.max(21.5, 19.75, 23))'
23
Etkileşimli Kabuk
Argümansız çağrıldığında çalışma zamanı bir etkileşimli kabuk (REPL) açar. Bu kabuk her satırı okur, değerlendirir, sonucu yazar ve döngüye döner. Adı bu dört adımdan gelir.
> const sicakliklar = [21.5, 19.75, 23, 18.25]; undefined > sicakliklar.length 4 > Math.max(...sicakliklar) 23 > typeof sicakliklar 'object'
İki gözlem bu kabuğu anlamak için yeterlidir.
Birincisi: kabuk, her satırın değerini yazar. Bir bildirim deyimi değer üretmez;
bu yüzden ilk satırın karşılığı undefined olmuştur. Bu, bildirimin başarısız olduğu
anlamına gelmez — sonraki satır değişkeni sorunsuz okuyor. Programlama Temelleri
kursundaki deyim–ifade ayrımı burada gözle görülür hale gelir: const bir deyimdir,
sicakliklar.length bir ifadedir.
İkincisi: kabuğun yazdığı biçim ile console.log biçimi aynı değildir. typeof
sonucu kabukta 'object' olarak, tırnaklarla yazıldı; aynı değer console.log ile
yazılsaydı tırnaksız object görünürdü. Kabuk değeri inceleme biçiminde yazar:
metinler tırnaklanır, böylece 4 sayısı ile '4' metni ayırt edilebilir. Bu biçimin
ayrıntıları çalışma zamanına özgüdür ve standartta tanımlı değildir.
Aynı fark nesnelerde de görülür:
const kayit = { istasyon: "A1", sicaklik: 21.5 }; console.log(kayit); console.log(String(kayit));
{ istasyon: 'A1', sicaklik: 21.5 }
[object Object]
İlk satırdaki okunabilir gösterim, ortamın inceleme biçimidir. İkinci satır ise dilin
kendi metne çevirme kuralının sonucudur ve her ortamda aynıdır. Tarayıcı konsolu ilk
satır için katlanıp açılabilen bir ağaç gösterir; ikinci satır orada da [object Object]
üretir.
Tarayıcı Konsolu ve Betik Etiketi
Belge tabanlı ortamda kod iki yoldan girer. Konsol, sayfanın bağlamında açılmış bir etkileşimli kabuktur; yukarıdaki kuralların aynısı geçerlidir. Betik etiketi ise kodu sayfanın yüklenme sürecine bağlar:
<script src="olcum.js"></script>
Etiketin konumu ve nitelikleri yürütme anını belirler. Nitelik verilmezse belge
çözümlemesi durur, kaynak indirilir ve çalıştırılır, sonra çözümleme sürer. defer
niteliği yürütmeyi belge çözümlemesinin sonuna erteler; type="module" niteliği hem
aynı ertelemeyi uygular hem de kaynağı betik değil modül olarak yükler.
Bu kursun örnekleri konsolda ve komut satırında doğrulanabilir; belge nesnelerine dokunmadıkları için sayfa bağlamı gerektirmezler. Belgeye erişen kod, dilin değil barındıran ortamın konusudur.
Betik mi, Modül mü
ECMAScript, bir kaynak metni iki farklı hedefe göre ayrıştırır: betik (script) ve modül (module). Bu, dosya uzantısından ya da etiket niteliğinden çıkarılan bir karardır ve üç somut fark üretir.
Birinci fark katı kiptir (strict mode). Modül olarak yüklenen kaynak her zaman katı kipte çalışır; betik olarak yüklenen kaynak, ayrıca istenmedikçe çalışmaz. Katı kip, sessizce yanlış sonuç üreten birkaç davranışı hataya çevirir. En görünür örneği, bildirilmemiş bir ada atama yapmaktır:
try { bildirilmemis = 5; } catch (hata) { console.log(hata.name + ": " + hata.message); }
Modül olarak (.mjs uzantısıyla) çalıştırıldığında:
ReferenceError: bildirilmemis is not defined
Aynı atama katı kipte olmayan bir betikte hata vermez; sessizce genel bir ad yaratır. Yazım hatasıyla oluşmuş bir adın program boyunca yaşaması bu yüzden mümkündür.
İkinci fark en dış kapsamdaki this değeridir. Modülde bu değer undefined’dır;
betikte ise ortamın seçtiği bir nesnedir.
Üçüncü fark, en dış kapsamda bildirilen adların genel nesneye yazılıp yazılmadığıdır. Modülde en dış kapsam modüle özeldir; orada bildirilen hiçbir ad genel nesnenin özelliği olmaz:
var x = 1; console.log(typeof this); console.log(typeof globalThis.x);
Modül olarak çalıştırıldığında:
undefined undefined
Klasik betik olarak yüklenen bir kaynakta ise var ile bildirilen en dış kapsam adları
genel nesnenin özelliği olur. İki dosyanın birbirinin adlarını kazara ezmesi bu
davranışın sonucudur; modül modeli bu paylaşımı ortadan kaldırır.
Kurs boyunca örnekler modül olarak çalıştırılmıştır. Bir örnek yalnızca betik kipinde farklı davranıyorsa, bu metinde ayrıca belirtilecektir.
Hata İletisini Okumak
Yakalanmamış bir hata üç parça bilgi taşır: hatanın adı, iletisi ve yığıt izi. Üçü ayrı ayrı okunabilir:
const kayitlar = [{ istasyon: "A1", sicaklik: 21.5 }]; try { console.log(kayitlar[1].sicaklik); } catch (hata) { console.log("ad :", hata.name); console.log("ileti:", hata.message); }
ad : TypeError ileti: Cannot read properties of undefined (reading 'sicaklik')
Ad, hatanın sınıfını verir. TypeError bir değerin beklenen türde olmadığını,
ReferenceError bir adın bulunamadığını, SyntaxError kaynağın ayrıştırılamadığını
bildirir.
İleti, olayın ayrıntısıdır. Yukarıdaki iletiyi adım adım okumak, hatanın nerede
olduğunu doğrudan söyler: kayitlar[1] değeri undefined çıkmıştır ve undefined
üzerinde sicaklik özelliği aranmıştır. Yani asıl sorun, dizinin ikinci elemanının
bulunmamasıdır — özelliğin adı değil. Hata iletisi, hatanın belirtisini gösterir;
nedeni genellikle bir üst satırdadır.
Yığın izi, hatanın hangi çağrı zincirinden geçtiğini at ile başlayan satırlarda
listeler. En üstteki satır hatanın oluştuğu yerdir; alt satırlar oraya kimin çağırdığını
verir. Yığın izinin biçimi, dosya yolları ve çalışma zamanının iç çerçeveleri makineye
göre değiştiği için bu kursta yalnızca ad ve ileti bölümleri gösterilecektir.
Yakalanmamış bir hata, sunucu tarafı çalışma zamanında süreci sıfırdan farklı bir çıkış koduyla sonlandırır. Tarayıcıda ise sayfa çalışmaya devam eder; hata yalnızca konsola yazılır. Aynı hatanın iki ortamdaki sonucu farklıdır, ama iletisi aynıdır.
Özet
- Kod dört yoldan girer: dosya, komut satırı argümanı, etkileşimli kabuk ve belge bağlamındaki betik etiketi.
- Etkileşimli kabuk her satırın değerini inceleme biçiminde yazar; bildirimler değer
üretmediği için
undefinedgörünür. Bu biçim standarttan değil ortamdan gelir. - ECMAScript bir kaynağı betik ya da modül olarak ayrıştırır; modül her zaman katı
kiptedir, en dış
thisdeğeriundefined’dır ve adları genel nesneye yazılmaz. - Katı kip, bildirilmemiş ada atamayı sessiz bir genel ad yaratmak yerine
ReferenceError’a çevirir. - Hata iletisi ad, ileti ve yığıt izinden oluşur; ileti belirtiyi anlatır, neden çoğu zaman bir önceki adımdadır.
Sonraki Adım
Betiğin modül olarak yüklenmesi, const ve let bildirimlerinin varlığı, for...of
döngüsü — bunların hepsi dilin belirli bir noktada kazandığı yeteneklerdir. Sonraki ders,
bir özelliğin dile nasıl girdiğini ele alacak: standardın sürümlenme biçimi, önerilerin
geçtiği aşamalar ve “bu özellik burada var mı” sorusunun sürüm adına bakmadan nasıl
yanıtlanacağı.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.