- Konu sahibi
- #1
JavaScript'te use strict nedir?
JavaScript'te
"use strict", kodu strict mode adı verilen daha katı çalışma kurallarında yürütmek için kullanılan özel bir yönergedir. Yazım hatalarını ve sessizce göz ardı edilen hataları daha erken görünür hâle getirir. Klasik betiğin veya uygun bir fonksiyon gövdesinin başındaki yönerge bölümüne eklenir. Eski kodda kapsamı bilinçli seçip ortaya çıkan hataları test ederek geçmek gerekir.
Kod:
"use strict";
let kullanici = "Ayşe";
console.log(kullanici);
Bu örnekte yönerge, değişken tanımı gibi sonraki kodu etkiler. Başka sıradan bir ifadeden sonra yazılırsa o kapsam için strict mode'u etkinleştirmez; yorumlar, boşluklar ve aynı yönerge bölümündeki diğer string yönergeler bununla karıştırılmamalıdır; yönerge olarak tanınması için fonksiyon gövdesinin veya betiğin başında, yalnızca ifade olarak bulunması gerekir.
Nasıl çalışır?
Strict mode bazı hatalı kullanımları sessizce düzeltmek veya yok saymak yerine hata olarak bildirir. Örneğin tanımlanmamış bir değişkene atama yapılamaz:
Kod:
"use strict";
sayac = 1;
Kod çalıştırıldığında
ReferenceError alınır; çünkü sayac daha önce let, const veya var ile tanımlanmamıştır. Doğru biçim şöyledir:
Kod:
"use strict";
let sayac = 1;
console.log(sayac); // 1
Strict mode, normal bir fonksiyon çağrısında
this değerini otomatik olarak global nesneye dönüştürmez. Bu nedenle aşağıdaki örnekte this değeri undefined olur:
Kod:
"use strict";
function kimim() {
return this;
}
console.log(kimim()); // undefined
Bu davranış, yanlış nesneyi değiştirme riskini azaltır. Bir nesne bağlamı gerekiyorsa fonksiyonu nesne üzerinden çağırabilir veya
call/bind ile açıkça bağlayabilirsiniz.Dosya ve fonksiyon kapsamı
Dosyanın başına yazılan yönerge, o betikteki ilgili kodu etkiler:
Kod:
"use strict";
function hesapla() {
toplam = 10; // ReferenceError
}
hesapla();
Yalnız bir fonksiyonu strict mode'a almak için yönergeyi fonksiyon gövdesinin ilk satırına koyabilirsiniz:
Kod:
function hesapla() {
"use strict";
let toplam = 10;
return toplam;
}
console.log(hesapla()); // 10
Strict olmayan dış koddan strict bir fonksiyon çağrılabilir; fonksiyonun kendi gövdesindeki kurallar yine strict olarak uygulanır. ES modülü olarak yüklenen kod (içinde import/export olmasa da) ve class gövdeleri zaten strict mode kurallarıyla çalıştığından bunlarda ayrıca
"use strict" yazmak genellikle gerekli değildir.Sık karşılaşılan farklar
Aşağıdaki karar tablosu, mevcut kodda yönerge eklerken hangi davranışı kontrol etmeniz gerektiğini gösterir.
| Durum | Strict olmayan davranış | Strict mode davranışı |
|---|---|---|
| Tanımsız değişkene atama | Global özellik oluşturabilir veya ortama göre sessiz kalabilir | Hata verir |
Normal fonksiyonda this | Global nesneye dönüştürülebilir | undefined olur |
| Salt okunur özelliği değiştirme | Atama yok sayılabilir | Hata verir |
| Aynı isimli fonksiyon parametreleri | Bazı durumlarda kabul edilebilir | Sözdizimi hatasıdır |
Bu yüzden yönergeyi ekledikten sonra özellikle tanımsız atamaları,
this kullanan fonksiyonları ve eski kodda tekrarlanan parametre adlarını test edin. Hata almanız, strict mode'un kodu bozduğu anlamına gelmez; daha önce gizlenen bir sorunu görünür kıldığı anlamına gelebilir.Uygulama adımları
- Kapsamı seçin: tüm klasik betik için ilk satıra, yalnızca bir bölüm için ilgili fonksiyonun ilk satırına
"use strict";ekleyin. - Kodunuzu çalıştırın ve ilk hatayı düzeltin. Tanımsız atamaları açık değişken bildirimleriyle değiştirin.
thiskullanan fonksiyonlarda çağrı biçimini kontrol edin; gereken nesneyi açıkça sağlayın.- Lint, birim testi veya normal çalışma senaryolarınızı yeniden çalıştırın. Hata olmaması yönergenin doğru tanındığının tek başına kanıtı değildir; konumunu ve betik/modül olarak nasıl yüklendiğini de doğrulayın.
Yönerge tek başına kodun tüm hatalarını bulmaz. Mantık hatalarını, asenkron işlemlerdeki sorunları veya yanlış API kullanımını otomatik olarak çözmez. Ayrıca strict mode bir güvenlik sınırı değildir; kullanıcı girdisini doğrulama ve uygun yetkilendirme gibi uygulama önlemlerinin yerini tutmaz.
Sık sorulan sorular
Varsayılan parametreli fonksiyonun içine use strict yazılabilir mi?
Parametre listesi varsayılan değer, destructuring veya rest parametre içeriyorsa fonksiyon gövdesine bu yönergeyi eklemek SyntaxError oluşturur. Gerekirse çevreleyen klasik betiği strict yapın veya modül bağlamını kullanın; yalnız yönergeyi gövdeye taşımak eşdeğer değildir.
Her JavaScript dosyasına use strict eklemeli miyim?
Klasik script dosyalarında kapsamı bilinçli seçerek ekleyebilirsiniz. ES modülleri ve class gövdeleri zaten strict olduğundan tekrar yazmak işlevsel bir değişiklik sağlamaz. Eski bir dosyada önce testleri çalıştırıp ortaya çıkan hataları düzeltmek daha güvenlidir.