Strict Mode (kısaca SM) EsmaScript 5 ile birlikte duyurulan ve JavaScript’deki esnek yazım biçimini ortadan kaldıran yeni bir özelliktir. Bu özelliği kullanarak yazılan JavaScript kodunun bütün yorumlayıcılarda aynı şekilde yorumlanması hedeflenmiştir. SM mode bir .js dosyasının tamamına uygulanabileceği gibi sadece belirli bir kod bloğunada uygulanması mümkündür. Kodumuzun başına “use strict”; olarak yazmak yeterlidir. Kelime anlamı olarak katı kuralları kullan manasına gelmektedir. Bu özelliği kullandığımızda JavaScript’deki bazı esneklikleri kullanamayacağımız için çeşitli hatalar alacağız. Bu bir JavaScript yazım kuralıdır diyebilir. Bu kuralların tamamını buradaki adresten görebilirsiniz. Bu kurallar sırasıyla şu şekildedir.
Birincisi SM’modu oluşturduğumuz .js dosyasının tamamına uygulanabilir. Örnek;
"use strict"; var karsilamaEkrani = function(isim){ alert(isim); } karsilamaEkrani('Merhaba Dünya');
SM mode herhangi bir kod bloğunada uygulanabilir. Örnek
var karsilamaEkrani = function(isim){ "use strict"; alert(isim); } karsilamaEkrani('Merhaba Dünya');
- Değişkenler mutlaka tanımlanmalıdır.
// normal kullanımda pi = 3.14; console.log(pi) // console ekranına 3.14 yazacaktır. // fakat "use strict" ile aynı kodu yazdığımızda "use strict"; pi = 3.14; console.log(pi) // ReferenceError: pi not defined // hatası alacağız. Çünkü pi değişkeni tanımlanmamış.
Yukarıdaki kodda aslında var ifade kullanmadan yapmak istenilen herhangi bir yerden ulaşılması mümkün bir pi değişkeni tanımlamaktı. SM olmadan pi = 3.14 yaptığımızda yorumlayıcı bunu otomatik olarak window.pi olarak kabul etmekteydi. Bu durumda kodumuzu şu şekilde değiştirebiliriz.
"use strict"; window.pi = 3.14; console.log(pi) // console ekranına 3.14 yazacaktır.
2. Normalde isimsiz (anonymous) veya bang function çalıştırıdığımızda fonksiyon içerisinde this objesini console ekranına yazdırabiliyorken, SM modda yazdıramayız. Console ekranına undefined çıktısı verecektir.
(function(){ "use strict"; console.log(this); // console ekranında çıktısı undefined olacaktır. }()); // Bu durumu şu şekilde çözebiliriz. (function(){ "use strict"; console.log(this) // console ekranında window objesini döndürecektir. }(window));
3. JS’deki eval fonksiyonu SM modda çalışmaz.
(function(){ "use strict"; var sayilar = eval("var pi=3.14"); console.log(pi); // ReferenceError: pi5 is not defined }()); // Bu kodu şu şekilde düzeltebiliriz. (function(){ "use strict"; console.log( new Function("var pi=3.14; return pi;")()) ; // console ekranına 3.14 yazacaktır. }());
4. Fonksiyon içerisinde rezerve edilmiş olan arguments ve eval değişkenleri tanımlanması JS yazım kuralı Syntax hatasına neden olur.
(function(){ "use strict"; var arguments = "Merhaba Dünya"; }()); // Unexpected eval or arguments in strict mode hatasına neden olur. // ya da (function(){ "use strict"; var eval = "Merhaba Dünya"; }());// Unexpected eval or arguments in strict mode hatasına neden olur.
5. SM mod olmadan 8 tabanı (octal) rakamlar oluşturmak için rakamın başına 0 yazmamız yeterliyken, SM modda bu şekildeki yazım Syntax hatasına neden olur.
(function(){ console.log(0120); // console ekranına 80 yazacaktır. }()); (function(){ "use strict"; console.log(0120); // SyntaxError: Octal literals are not allowed in strict mode. // hatası console ekranına yazılacaktır. }())
6. SM modda read-only verilerin değiştirilmesine izin verilmez. Sadece okunabilir olan değişkenlere (undefined, NaN gibi) değer atamak SM modda mümkün değildir. Normal yazımda da bu mümkün değildir fakat SM mod bunu karşımıza hata olarak çıkarmaktadır.
(function(){ undefined = 'merhaba dünya'; // bu şekilde yazmak herhangi bir hataya sebep vermez. // fakat console ekranına; console.log(undefined); // yazarsak ekrana yine undefined yazıldığını göreceksiniz. }()); (function(){ "use strict"; undefined = "merhaba dünya"; console.log(undefined); // Cannot assign to read only property 'undefined' of object // hatasına neden olacaktır. }())
7. Aynı şekilde kendi tanımladığımız objelerin içindeki read-only keylerine değer ataması söz konusu değildir.
(function(){ "use strict"; var kalem = {}; Object.defineProperty(kalem, "fiyat", { value : "2 TL", writable:false, deletable:false, }); kalem.fiyat = "3 TL"; // Cannot assign to read only property 'fiyat' of object // hatasını alırız. // Aynı kodu aynı şekilde tanımlayıp delete kalem.fiyat; //çalıştırırsak // Cannot delete property 'fiyat' // Hatasını alırız. }());
8. ES5 ile birlikte gelen yeni özellikten birisi de nesnelerin genişletilebilirliliğini kapatabilmemizdir. Yani bir nesneyi tanımladıktan sonra o nesneyi bir nevi dondurabiliyoruz. SM modda genişletilebilirliliği kapatılmış nesneleri genişletmek istediğimiz zaman hata vermektedir.
(function(){ "use strict"; var kalem = {}; Object.defineProperty(kalem, "fiyat", { value : "2 TL", writable:false, deletable:false, }); Object.preventExtensions(kalem); kalem.stokDurumu = 'var'; // console ekranına // Can't add property stokDurumu, object is not extensible // hatasını döndürecektir. }());
Kaynaklar: https://developer.mozilla.org
http://ecma262-5.com/ELS5_HTML.htm#Annex_C