Strict mode, JavaScript'in daha katı bir varyantını açıkça seçmenizi sağlar. Bir dosyanın ya da fonksiyonun en başına tam olarak "use strict"; yazdığınızda etkinleşir. ES modülleri ve sınıf gövdeleri ise hiçbir şey yazmadan otomatik olarak strict çalışır. Strict mode sessizce yutulan bazı hataları gerçek hatalara çevirir, this ve arguments davranışını sadeleştirir ve gelecekteki sözdizimi için bazı sözcükleri ayırır.
Strict mode yalnızca bir alt küme değildir; bazı durumlarda kasıtlı olarak farklı anlam taşır. Strict olan ve olmayan kod aynı programda bir arada çalışabildiği için eski bir kod tabanını dosya dosya, hatta fonksiyon fonksiyon geçirebilirsiniz. Strict olmayan varsayılan moda gayriresmî olarak "sloppy mode" denir.
Strict mode nasıl etkinleştirilir?

Yönerge, betiğin ya da fonksiyon gövdesinin ilk ifadesi olmalıdır. Öncesinde başka bir ifade varsa sıradan bir metin olarak değerlendirilir ve etkisi olmaz. Süslü parantezli bir bloğun içine yazmak da işe yaramaz:
{
"use strict"; // blok içinde etkisi yok
globalYeni = 1;
}
console.log(globalYeni); // 1Fonksiyon düzeyinde kullanım:
function gevsek() {
toplamm = 5; // yazım hatası sessizce global oluşturur
return typeof globalThis.toplamm;
}
console.log(gevsek()); // number
function siki() {
"use strict";
sonucc = 5;
}
siki();
// ReferenceError: sonucc is not definedModüller ve sınıflar otomatik olarak strict
ES modüllerinin tüm içeriği strict mode'dadır. Node.js'te .mjs uzantılı dosyalar modül olarak yüklenir, bu yüzden aşağıdaki kod hiçbir yönerge olmadan strict davranır. Sınıf bildirimlerinin ve sınıf ifadelerinin gövdesi de her zaman strict'tir.
// dosya: ornek.mjs
function f() { return this; }
console.log(f()); // undefined
x = 1;
// ReferenceError: x is not definedclass Sinif {
test() { return this; }
sil() { delete Object.prototype; }
}
const yontem = new Sinif().test;
console.log(yontem()); // undefined
new Sinif().sil();
// TypeError: Cannot delete property 'prototype' of function Object() { [native code] }Klasik betik olarak yüklenen CommonJS dosyaları ise siz yazmadıkça strict değildir. Modül sistemleri hakkında ayrıntı için ES modülleri yazısına, sınıflar için class rehberine bakabilirsiniz.
Sessiz hatalar gerçek hatalara dönüşür
Sloppy mode'da başarısız olan bazı atamalar hiçbir uyarı vermeden yok sayılır. Strict mode'da aynı işlemler TypeError fırlatır. Aşağıdaki çıktılar Node.js 24'ten alınmıştır:
"use strict";
const urun = {};
Object.defineProperty(urun, "kod", { value: "A1", writable: false });
urun.kod = "B2";
// TypeError: Cannot assign to read only property 'kod' of object '#<Object>'
const kutu = { get alan() { return 12; } };
kutu.alan = 20;
// TypeError: Cannot set property alan of #<Object> which has only a getter
const sabit = Object.freeze({ x: 1 });
sabit.y = 2;
// TypeError: Cannot add property y, object is not extensible
"metin".uzunluk = 3;
// TypeError: Cannot create property 'uzunluk' on string 'metin'
undefined = 5;
// TypeError: Cannot assign to read only property 'undefined' of object '#<Object>'
// (strict olmayan kodda bu satırların hiçbiri hata vermez)Aynı satırlar strict olmadan çalıştırıldığında hiçbiri hata vermez; sabit.y sonradan okunduğunda undefined döner ve hatanın kaynağını bulmak zorlaşır.
Sözdizimi düzeyinde yasaklananlar

Bazı yapılar strict mode'da kod çalışmadan, ayrıştırma aşamasında SyntaxError verir:
| Yapı | Node.js 24 mesajı |
|---|---|
| const n = 010; (0 ile başlayan eski sekizlik) | Octal literals are not allowed in strict mode. |
| function f(a, a) {} | Duplicate parameter name not allowed in this context |
| with (Math) { ... } | Strict mode code may not include a with statement |
| var x; delete x; | Delete of an unqualified identifier in strict mode. |
| let public = 1; | Unexpected strict mode reserved word |
| let eval = 1; | Unexpected eval or arguments in strict mode |
Sekizlik sayı yazmak isterseniz standart 0o önekini kullanın: 0o10 değeri 8'dir. Strict mode'da ayrılan ek sözcükler implements, interface, let, package, private, protected, public, static ve yield'dir.
this, arguments ve eval davranışı
Sloppy mode'da düz bir fonksiyon çağrısında this global nesne olur ve ilkel değerler nesneye sarılır. Strict mode'da this neyse o kalır: belirtilmemişse undefined, call(7) ile verilmişse doğrudan 7. Bu, metodu nesneden koparıp çağırdığınızda yanlışlıkla global nesneyi değiştirmenizi engeller. Konunun tamamı this anahtar kelimesi yazısında.
"use strict";
function kim() { return this; }
console.log(kim()); // undefined
console.log(kim.call(7)); // 7
function parametre(a) {
a = 42;
return [a, arguments[0]];
}
console.log(parametre(17)); // [ 42, 17 ]Sloppy mode'da aynı parametre(17) çağrısı [ 42, 42 ] döndürür, çünkü parametre ile arguments nesnesi birbirine bağlıdır. Strict mode bu bağı koparır. Ayrıca arguments.callee, fn.caller ve fn.arguments erişimi TypeError verir; özyineleme için fonksiyona isim vermeniz yeterlidir. Strict mode'da eval çevresindeki kapsama yeni değişken eklemez ve blok içindeki fonksiyon bildirimleri yalnızca o blokta görünür.
eval kapsamı nasıl değişir?
Sloppy mode'da eval("var y = 2;") çağrısı, çağrıldığı kapsama yeni bir değişken ekleyebilir ya da var olanın üzerine yazabilir. Bu, motorun bir ismin hangi değişkene karşılık geldiğini kod çalışmadan bilmesini imkânsız kılar. Strict mode'da değerlendirilen kod kendi kapsamını alır ve dışarıyı etkilemez:
var y = 1;
eval("var y = 2;");
console.log(y); // 2 (sloppy: dış değişken değişti)
var x = 17;
var evalX = eval("'use strict'; var x = 42; x;");
console.log(x, evalX); // 17 42 (strict: dış x etkilenmedi)eval içindeki kodun strict olup olmadığı, çağrının doğrudan (direct) ya da dolaylı (indirect) olmasına da bağlıdır. Pratik öneri basittir: eval'e gerçekten ihtiyacınız yoksa kullanmayın. Kapsamın genel kuralları için scope rehberine bakabilirsiniz.
Karşılaştırma tablosu

| Durum | Sloppy mode | Strict mode |
|---|---|---|
| Tanımsız değişkene atama | Global özellik oluşturur | ReferenceError |
| Salt okunur özelliğe atama | Sessizce yok sayılır | TypeError |
| İlkel değere özellik atama | Sessizce yok sayılır | TypeError |
| Düz çağrıda this | Global nesne | undefined |
| arguments ve parametre | Birbirine bağlı | Bağımsız |
| with ifadesi | İzinli | SyntaxError |
| 010 gibi sekizlik sayı | 8 olarak okunur | SyntaxError |
Mevcut koda geçiş ve sık yapılan hatalar
- Yönergeyi dosyanın en başına değil de bir
importya da başka bir ifadeden sonraya yazmak: yönerge etkisiz kalır (modüllerde zaten gerek yoktur). - Strict ve sloppy dosyaları basitçe birleştirmek: ilk dosyadaki yönerge, birleştirilen tüm kodu strict yapabilir ya da tam tersi kaybolabilir. Fonksiyon düzeyinde kapsamak daha güvenlidir.
- Bağımsız fonksiyonlarda
thisdeğerinin global nesne olacağına güvenmek: global nesneye erişmek için açıkçaglobalThiskullanın. - Geçişten sonra yalnızca sözdizimi hatalarına bakmak:
thisveargumentsfarkları çalışma anında ortaya çıkar, testlerle doğrulayın.
Strict mode'un görünür hale getirdiği hata mesajlarının genel açıklaması için sık hata mesajları yazısına bakabilirsiniz.
Sık Sorulan Sorular
ES modülü kullanıyorsam "use strict" yazmam gerekir mi?
Hayır. Modüllerin tüm içeriği otomatik olarak strict mode'dadır. Yazmanız zarar vermez ama bir etkisi de yoktur.
Strict mode kodu hızlandırır mı?
MDN, strict mode'un motorların optimizasyonunu zorlaştıran bazı hataları giderdiğini ve bu yüzden aynı kodun bazen daha hızlı çalışabildiğini söyler. Bunu genel bir hız garantisi olarak görmeyin; asıl kazanç hataların erken yakalanmasıdır.
Strict mode sadece bir bloğa uygulanabilir mi?
Hayır. Yalnızca betiğin tamamına ya da bir fonksiyona uygulanır. Süslü parantezli bir blok içine yazılan yönergenin etkisi yoktur.
Node.js'te normal .js dosyaları strict mi çalışır?
Bu yazıdaki denemelerde CommonJS olarak yüklenen .js dosyası, yönerge yazılmadıkça sloppy mode'da çalıştı; .mjs dosyası ise modül olduğu için strict davrandı. Projeniz ES modülleriyle çalışıyorsa yönergeye gerek kalmaz.
Nesne literalinde aynı özelliği iki kez yazmak hata mı?
Artık değil. ES2015 ile hesaplanmış özellik adları geldiğinde bu kısıtlama strict mode'dan da kaldırıldı; sonraki değer öncekinin üzerine yazar.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: JavaScript öğrenme rehberi · this anahtar kelimesi · ES modülleri · var, let ve const · Sık hata mesajları