Strict Mode: JavaScript'in Daha Katı Bir Versiyonu
JavaScript'in uzun bir geçmişi var ve bu geçmiş beraberinde bir sürü tartışmalı kararı da taşıyor: sessizce global değişken oluşturan atamalar, fonksiyonu nasıl çağırdığınıza göre anlam değiştiren bir this, aynı isimle tanımlanan parametrelerin sorunsuzca çalışması... Bunların herhangi birini değiştirmek web'i bozacağından, dili yöneten TC39 komitesi farklı bir yol tercih etti: keskin köşelerin törpülendiği, isteğe bağlı olarak aktifleştirilen bir mod.
İşte bu opsiyonel moda strict mode (katı mod) deniyor. Tek satırla, dosyanın ya da fonksiyonun en başına yazarak etkinleştiriyorsunuz:
Çalıştırdığınızda ReferenceError: x is not defined hatasıyla karşılaşırsınız. Bu direktif olmadan aynı kod, x adında küresel bir değişkeni sorunsuzca oluşturup 10 yazdırır. Aynı dil, ama iki farklı kurallar bütünü.
'use strict' direktifi nedir?
Direktif aslında sadece bir string literal — 'use strict'; ya da "use strict";. Script ya da fonksiyonun ilk ifadesi olmak zorunda. Önünde herhangi bir şey varsa, hatta başıboş bir ifade bile olsa, motor bunu sıradan bir string olarak görür ve hiç dikkate almaz.
Strict mode'u yalnızca tek bir fonksiyonla sınırlandırmak istiyorsan direktifi o fonksiyonun içine yazabilirsin. Ama gerçek hayatta bunu artık kimse yapmıyor — ya modül yazıyorsun (zaten otomatik olarak strict) ya da tüm dosyayı birden strict moda çeviriyorsun.
Strict Mode Tam Olarak Neyi Değiştiriyor?
Strict mode tek bir kuraldan ibaret değil; bir dizi kuralın paketi. Öne çıkanlar şöyle:
- Tanımlanmamış bir değişkene atama yapmak artık sessizce global oluşturmuyor, hata fırlatıyor.
- Sıradan bir fonksiyon çağrısının içindeki
thisartık global nesne değil,undefinedoluyor. - Aynı isimde birden fazla parametre (
function f(a, a) {}) syntax hatası veriyor. - Salt okunur (
read-only) özelliklere atama yapmak sessizce başarısız olmak yerine hata fırlatıyor. - Normal bir değişkeni veya fonksiyonu
deleteile silmeye çalışmak hata veriyor. - İleride ayrılmış bazı kelimeler (
implements,interface,package,private,protected,public,static,yield) değişken ismi olarak kullanılamıyor.
Kısa bir turla bakalım:
Her biri aslında "motor olası bir hatayı erkenden yakaladı" demek. İşin özeti de bu: strict mode'un asıl değeri burada.
Sessizce Global'e Sızan Bug
JavaScript strict mode'un var oluş sebebi büyük ölçüde bu. Strict mode olmadan, ufacık bir yazım hatası bir anda global değişkene dönüşür:
// Katı olmayan mod (bunu yapmayın)
function setup() {
usernmae = 'Ada'; // yazım hatası — window.usernmae oluşturur
}
setup();
console.log(username); // undefined — gerçek değişken hiç atanmadı
Program çalışır. Hata da vermez. Ancak bug, ilerleyen bir yerde username okuması gereken bir şey undefined bulduğunda ortaya çıkar. Strict mode'da ise aynı typo kod çalışır çalışmaz hata fırlatır; saatlerce uğraşmak yerine saniyeler içinde düzeltirsiniz.
Modern JavaScript Zaten Varsayılan Olarak Strict Mode'da
İnsanların kafasını karıştıran kısım şu: bugün yazdığınız JavaScript kodunun büyük çoğunluğu hiçbir yere 'use strict' yazmadığınız hâlde zaten strict mode'da çalışıyor.
Otomatik olarak strict mode'u devreye sokan iki temel kaynak var:
- ES modülleri. Her
.mjsdosyası, her<script type="module">veimport/exportile dahil edilen her şey strict mode'da çalışır. Ayrıca bir direktif yazmanıza gerek yok. - Class gövdeleri. Bir
class { ... }içindeki her ifade strict mode'dadır; dosyanın geri kalanı strict olmasa bile.
Peki 'use strict'; satırını ne zaman kendiniz yazmanız gerekiyor? Sadece klasik script'lerde — yani düz bir <script> etiketiyle yüklenen eski tarz JS dosyalarında ya da module bundler kullanmadan require ile çalışan eski Node.js dosyalarında. Yeni yazdığınız her şeyde modüller bu işi zaten sizin için hallediyor.
Strict mode, normal fonksiyonlarda this davranışını değiştirir
Yeni başlayanları sık sık yakalayan bir davranış bu, o yüzden ayrıca değinmekte fayda var. Strict mode kapalıyken, sıradan bir fonksiyonu önünde herhangi bir nesne olmadan çağırdığınızda this, global nesneye bağlanır (tarayıcıda window, Node'da global). Strict mode açıkken ise this değeri undefined olur:
Çoğu zaman aslında istediğin şey tam olarak budur. this'in undefined olması, bir metodu bind etmeyi unuttuğun bir hatayı anında yüzeye çıkarır. Eğer sessizce global nesneye işaret ediyor olsaydı, bu bug ileride bir yerde bir şey kırılana kadar gizli kalırdı.
Strict Mode'un Yapmadıkları
JavaScript strict mode derleme ve çalışma zamanında bazı kuralları sıkılaştırır — sana tip sistemi sunmaz, null erişimlerini yakalamaz, kullanılmayan değişkenler için uyarı vermez. Bunlar TypeScript, ESLint ve editörünün işi. Strict mode'u, dilin kendi içindeki belirli bir avuç tuzağı kapatan bir mekanizma olarak düşün; tam kapsamlı bir güvenlik ağı değil.
Ayrıca "modern JavaScript" ile de aynı şey değil. Strict mode içinde berbat kod da yazabilirsin, direktifi hiç kullanmadan harika kod da. Sadece bazı spesifik hataları yapmayı zorlaştırıyor.
Özetle Aklında Kalması Gerekenler
- Dosyanın ya da bir fonksiyonun başına yazılan
'use strict';, JavaScript'in daha katı bir sürümüne geçmeni sağlar. - Yazım hataları artık global değişken üretmez,
thissessizce global nesneye dönüşmez ve buna benzer birkaç tuzak doğrudan hataya dönüşür. - ES modülleri ve
classgövdeleri zaten otomatik olarak strict mode'dadır — direktifi elle yazman çoğu zaman gerekmez. - Amaç yeni özellikler açmak değil, hataları erkenden yakalamak.
Sırada: Yorum Satırları
Direktifleri, noktalı virgülleri ve motorun umursadığı kuralları gördün. Sırada senin ileride kodu okuyacaklar için bıraktığın notlar var: JavaScript'te yorum satırları nasıl çalışır ve hangi durumlarda yazmaya değer, ona bakacağız.
Sıkça Sorulan Sorular
JavaScript'te strict mode nedir?
Strict mode, JavaScript'in isteğe bağlı olarak açılan daha sıkı bir sürümüdür. Normalde sessiz sedasız geçiştirilen bazı hataları gerçek hataya dönüştürür. Aktif etmek için dosyanın veya fonksiyonun en üstüne 'use strict'; yazmanız yeterli. Bu modda tanımlanmamış bir değişkene atama yapmak hata fırlatır, aynı isimde iki parametre kullanamazsınız ve düz bir fonksiyon çağrısında this artık global obje değil, undefined olur.
JavaScript'te strict mode nasıl aktif edilir?
'use strict'; ifadesini bir script veya fonksiyonun ilk satırına koymanız gerekiyor. Öncesinde hiçbir şey, hatta yorum olmayan boş bir satır bile olmamalı — aksi halde JavaScript bunu sıradan bir string olarak görür ve görmezden gelir. Modern kodda bunu genelde elle yazmanıza gerek kalmaz: ES modülleri (.mjs dosyaları veya <script type="module">) ve her class gövdesi zaten otomatik olarak strict moddur.
Strict mode kullanmanın ne faydası var?
En büyük faydası bug'ları erken yakalamak. Mesela usernmae = 'Ada' gibi bir yazım hatası normal modda sessizce global bir değişken oluşturur; strict modda ise direkt ReferenceError fırlatır. Bunun yanında strict mode bazı kelimeleri ileride kullanılmak üzere rezerve eder, eski motorlarda aynı isimli property tanımlamanıza izin vermez ve this'in davranışını öngörülebilir hale getirir. Sonuç: kodu takip etmek çok daha kolay.
Modern JavaScript'te hâlâ 'use strict' yazmak gerekiyor mu?
Genelde hayır. ES modülleri ve class gövdeleri zaten strict modda çalışıyor ve bugünkü projelerin neredeyse tamamı bu ikisinden biri. 'use strict'; yazmanızı gerektiren tek senaryo, eski tarz klasik scriptler — yani type="module" olmadan düz bir <script> etiketiyle yüklenen dosyalar.