web-gelistirme-sc.com

JavaScript'te "katı kullanımı" ne yapar ve arkasındaki sebep nedir?

Son zamanlarda, bazı JavaScript kodlarımı Crockford's JSLint üzerinden kullandım ve aşağıdaki hatayı verdi:

1. satırdaki sorun 1. karakter: "use strict" ifadesinin eksik olması.

Biraz arama yaparak, bazı kişilerin JavaScript kodlarına "use strict"; eklediklerini fark ettim. İfadeyi eklediğimde hata görünmedi. Maalesef, Google bu yaylı ifadenin arkasındaki geçmişin çoğunu açıklamadı. Kesinlikle, JavaScript'in tarayıcı tarafından nasıl yorumlandığı ile ilgisi olmalı, ancak etkinin ne olacağı hakkında hiçbir fikrim yok.

Öyleyse "use strict"; ile ilgili her şey, neyi ifade ediyor ve hala geçerli mi?

Mevcut tarayıcılardan herhangi biri "use strict"; dizgisine cevap veriyor mu yoksa ileride kullanmak üzere mi?

7004
Mark Rogers

Javascript Sıkı Modu ile ilgili bu makale ilginizi çekebilir: John Resig - ECMAScript 5 Sıkı Modu, JSON ve Dahası

Bazı ilginç kısımları alıntılamak için:

Sıkı Mod, ECMAScript 5'teki bir program veya bir işlevi "katı" bir işletim bağlamında yerleştirmenize olanak sağlayan yeni bir özelliktir. Bu katı bağlam belirli eylemlerin alınmasını önler ve daha fazla istisna atar.

Ve:

Sıkı mod birkaç şekilde yardımcı olur:

  • İstisnaları dağıtan bazı kodlama kodlayıcıları yakalar.
  • Göreceli olarak "güvensiz" eylemler gerçekleştirildiğinde (küresel nesneye erişim kazanma gibi) hataları önler veya fırlatır.
  • Kafa karıştırıcı veya kötü düşünülmüş özellikleri devre dışı bırakır.

Ayrıca tüm dosyaya "katı kip" uygulayabileceğinizi unutmayın ... Ya da yalnızca belirli bir işlev için kullanabilirsiniz (John Resig'in makalesinden alıntı yaparak):

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

Eski ve yeni kodu karıştırmanız gerekirse, hangisi yararlı olabilir ;-)

Bu yüzden sanırım Perl (dolayısıyla adı?): 'Da kullanabileceğiniz "use strict" gibi bir şeydir, kırılmalara neden olabilecek daha fazla şey tespit ederek daha az hata yapmanıza yardımcı olur.

Şu anda, tüm büyük tarayıcılar tarafından destekleniyor(bar IE 9 ve altı).

4608
Pascal MARTIN

Bu ECMAScript 5'in yeni bir özelliği. John Resig, Güzel bir özeti yazdı.

Sadece JavaScript dosyalarınıza (dosyanızın en üstünde veya bir fonksiyonun içinde) koyduğunuz bir dize şuna benzer:

"use strict";

Şimdi kodunuza koymak, sadece bir dize olduğu için mevcut tarayıcılarda herhangi bir soruna neden olmamalıdır. Kodunuz pragmayı ihlal ederse gelecekte kodunuzla ilgili sorunlara neden olabilir. Örneğin, eğer ilk önce foo tanımlamaksızın foo = "bar" kullanıyorsanız, kodunuz başarısız olmaya başlayacak ... bence bu iyi bir şey.

1157
seth

"use strict"; ifadesi, tarayıcıya JavaScript'in azaltılmış ve daha güvenli bir özellik kümesi olan Sıkı modunu kullanması talimatını verir. 

Özelliklerin listesi (ayrıntılı olmayan)

  1. Global değişkenlere izin verilmez. (Değişken adlarındaki eksik var bildirimlerini ve yazım hatalarını yakalar) 

  2. Sessiz başarısızlık atamaları katı modda hata verir (atama NaN = 5;

  3. Silinemeyen özellikleri silme girişimleri fırlatılacak (delete Object.prototype

  4. Bir nesne değişmezindeki tüm özellik adlarının benzersiz olmasını gerektirir (var x = {x1: "1", x1: "2"}

  5. İşlev parametresi adları benzersiz olmalıdır (function sum (x, x) {...}

  6. Sekizli sözdizimini yasaklar (var x = 023; bazı dev'ler hatalı bir şekilde önceki sıfıra sayıyı değiştirmek için hiçbir şey yapmadığını varsaymaktadır.) 

  7. with anahtar sözcüğünü yasaklar 

  8. Katı modda eval yeni değişkenler getirmez 

  9. Düz adları silmeyi yasaklar (delete x;)

  10. eval ve arguments adlarının herhangi bir biçimde ciltlenmesi veya atanması yasaklanır 

  11. Sıkı kip, arguments nesnesinin özelliklerini biçimsel parametrelerle değiştirmez. (yani function sum (a,b) { return arguments[0] + b;}'da çalışır. Bu, çünkü arguments[0]a ve benzerlerine bağlı olduğundan.)

  12. arguments.callee desteklenmiyor

[Ref: Sıkı mod , Mozilla Developer Network]

575
gprasant

İnsanlar use strict kullanmaktan endişe ediyorlarsa, bu makaleye göz atmaya değer olabilir: 

ECMAScript 5 'Sıkı mod' tarayıcılarda desteklenir. Ne anlama geliyor?
NovoGeek.com - Krishna'nın blogu

Tarayıcı desteği hakkında konuşuyor, ancak daha da önemlisi güvenli bir şekilde nasıl başa çıkılacağı:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/
386
Jamie Hutber

Dikkatli bir şekilde, tüm zorlayıcı programcılar: varolan koda "use strict" uygulamak tehlikeli olabilir! Bu, 'daha iyi' yapmak için kodun üzerine tokatlayabileceğiniz iyi hissetmenizi sağlayan, mutlu bir yüz etiketi değildir. "use strict" pragma ile, tarayıcı aniden, daha önce hiç fırlatılmadığı rastgele yerlerde istisnalar atacak, çünkü o noktada varsayılan/gevşek JavaScript'in mutlu bir şekilde izin verdiği ancak katı JavaScript'den nefret eden bir şey yapıyorsunuz! Kodunuzda nadiren kullanılan çağrıları gizleyen kesinlikte ihlaller olabilir; bu, yalnızca sonuçta çalıştırıldığı zaman bir istisna oluşturacak - örneğin, ödeme yapan müşterilerinizin kullandığı üretim ortamında!

Eğer dalmaya devam edecekseniz, kapsamlı ünite testlerinin yanı sıra modülünüzün korkunç derecede havaya uçuracağına dair karanlık bir köşe olmadığına dair bir güven verecek, kesinlikle yapılandırılmış bir JSHint inşa görevi ile birlikte "use strict" uygulamak iyi bir fikirdir. Sıkı Modu'nu açtınız. Veya, hey, işte başka bir seçenek: sadece eski kodunuzdan hiçbirine "use strict" eklemeyin, muhtemelen daha güvenli, dürüst olmak gerekirse. KESİNLİKLE YAPMAYIN / üçüncü parti modüller gibi, sahip olmadığınız veya bakımını yapmadığınız modüllere "use strict" ekleyin.

Bence ölümcül kafesli bir hayvan olsa da, "use strict" iyi şeyler olabilir, ama bunu doğru yapmak zorundasınız. Kesinleşmenin en iyi zamanı, projenizin yeşil alan olduğu ve sıfırdan başladığınız zamandır. JSHint/JSLint adresini, ekibinizin mide edebileceği kadar sıkıştırarak tüm uyarılar ve seçeneklerle yapılandırın, Grunt+Karma+Chai gibi düzenlenmiş iyi bir derleme/test/assert sistemi elde edin ve tüm yeni modüllerinizi "use strict" olarak işaretlemeye başlayın. Çok fazla hata ve uyarıyı düzeltmek için hazırlıklı olun. Eğer JSHint/JSLint herhangi bir ihlale neden olursa, yapıyı FAIL olarak yapılandırarak yerçekimini herkesin anladığından emin olun.

Projem, "use strict" öğesini benimsediğimde yeşil alan projesi değildi. Sonuç olarak, benim IDE kırmızı işaretlerle dolu çünkü modüllerimin yarısında "use strict" yok ve JSHint bundan şikayet ediyor. Gelecekte hangi refactoring yapmam gerektiğini hatırlatıyor. Amacım, eksik "use strict" ifadelerimin tümü nedeniyle kırmızı işaret ücretsiz olmaktır, ancak bu yıllar şimdi.

194
DWoldrich

_'use strict';_ kullanılması, aniden kodunuzu iyileştirmez.

JavaScript katı mod , ECMAScript 5 içindeki bir özelliktir. Sıkı modunu, komut dosyanızın/işlevinizin üstünde bunu bildirerek etkinleştirebilirsiniz.

_'use strict';
_

Bir JavaScript motoru bu yönergesini gördüğünde, kodu özel modda yorumlamaya başlar. Bu modda, potansiyel hatalar olarak ortaya çıkabilecek belirli kodlama uygulamaları tespit edildiğinde hatalar atılır (katı modun arkasındaki sebep budur).

Bu örneği düşünün:

_var a = 365;
var b = 030;
_

Sayısal değişmezleri hizalamak konusundaki saplantılarında, geliştirici yanlışlıkla b değişkenini sekizli bir değişmezle başlattı. Katı olmayan mod, bunu _24_ (temel 10'da) değerine sahip sayısal bir değişmez olarak yorumlayacaktır. Ancak katı mod bir hata verecektir.

Sıkı moddaki ayrıntılı olmayan özelliklerin listesi için, bu yanıtı .


Nerede _'use strict';_ kullanmalıyım?

  • Yeni JavaScript uygulamamda: Kesinlikle! Sıkı mod yaparken, titizlik modu bir bilgi uçağı olarak kullanılabilir kodunuzla aptalca bir şey.

  • Benim var olan JavaScript kodumda: Muhtemelen hayır! Mevcut JavaScript kodunuzda yasaklanmış ifadeler varsa Sıkı mod, uygulama sadece kıracak. Sıkı mod istiyorsanız, mevcut kodunuzu hata ayıklamak ve düzeltmek için hazırlıklı olmalısınız. Bu yüzden _'use strict';_ kullanarak kodunuzu aniden kodunuzu iyileştirmez .


Sıkı modu nasıl kullanırım?

  1. Komut dosyanızın üstüne bir _'use strict';_ deyimi ekleyin:

    _// File: myscript.js
    
    'use strict';
    var a = 2;
    ....
    _

    _myscript.js_ dosyasındaki her şeyin katı modda yorumlanacağına dikkat edin.

  2. Veya, işlev gövdesinin üstüne bir _'use strict';_ deyimi ekleyin:

    _function doSomething() {
        'use strict';
        ...
    }
    _

    doSomething işlevinin sözcük kapsamındaki her şey katı modda yorumlanacaktır. Word sözcük kapsamı burada önemlidir. Daha iyi bir açıklama için bakınız bu cevap .


Sıkı modda hangi şeyler yasaktır?

Sıkı modda yasaklanmış birkaç şeyi açıklayan bir Güzel makale buldum (bunun özel bir liste olmadığını unutmayın):

Dürbün

Tarihsel olarak, JavaScript işlevlerin nasıl ele alındığına dair karıştı. Bazen statik olarak algılanır gibi görünürler, ancak bazı özellikler dinamik olarak algılanır gibi davranmalarını sağlar. Bu kafa karıştırıcıdır, programların okunmasını ve anlaşılmasını zorlaştırır. Yanlış anlama böceklere neden olur. Aynı zamanda performans için bir sorundur. Statik kapsam belirleme, derleme zamanında değişken ciltlemenin yapılmasına izin verir, ancak dinamik kapsam gereksinimi, derlemenin çalışma süresine ertelenmesi gerektiği anlamına gelir, bu da önemli bir performans cezasıyla birlikte gelir.

Sıkı mod, tüm değişken bağlamanın statik olarak yapılmasını gerektirir. Bu, daha önce dinamik bağlanma gerektiren özelliklerin ortadan kaldırılması veya değiştirilmesi gerektiği anlamına gelir. Spesifik olarak, with ifadesi elimine edilir ve eval işlevinin arayanın ortamını tahrif etme kabiliyeti ciddi şekilde kısıtlanır.

Sıkı kodun yararlarından biri YUI Compressor gibi araçların işlenirken daha iyi bir iş yapabilmesidir.

Zımni Global Değişkenler

JavaScript global değişkenleri ima etti. Açıkça bir değişken bildirmezseniz, sizin için dolaylı olarak global bir değişken bildirilir. Bu, yeni başlayanlar için programlamayı kolaylaştırır, çünkü temel temizlik işlerinin bir kısmını ihmal edebilirler. Ancak daha büyük programların yönetimini çok daha zorlaştırır ve güvenilirliği önemli ölçüde azaltır. Yani katı modda, ima edilen global değişkenler artık yaratılmamaktadır. Tüm değişkenlerinizi açıkça belirtmelisiniz.

Global Sızıntı

this 'in global nesneye bağlanmasına neden olabilecek bazı durumlar vardır. Örneğin, yapıcı işlevini çağırırken new önekini vermeyi unutursanız, yapıcı this beklenmedik bir şekilde genel nesneye bağlanır, bu nedenle yeni bir nesneyi başlatmak yerine, bunun yerine genel değişkenlerle sessizce kurcalanır. Bu gibi durumlarda, katı mod thisundefined' e bağlar ve bu da yapıcının bir istisna atmasına neden olarak hatanın daha erken tespit edilmesini sağlar.

Gürültülü Arıza

JavaScript her zaman salt okunur özelliklere sahiptir, ancak ES5’ __ _Object.createProperty_ işlevi bu özelliği gösterene kadar kendiniz oluşturamazsınız. Salt okunur bir özelliğe bir değer atamayı denerseniz sessizce başarısız olur. Atama, mülkün değerini değiştirmez, ancak programınız olduğu gibi devam eder. Bu, programların tutarsız bir duruma geçmesine neden olabilecek bir bütünlük tehlikesidir. Sıkı modda, salt okunur bir özelliği değiştirmeye çalışmak bir istisna atar.

Sekizli

Sayıların sekizli (veya temel 8) gösterimi, Word boyutları 3 katı olan makinelerde makine düzeyinde programlama yaparken son derece kullanışlıdır, Word boyutu 60 bit olan CDC 6600 anabilgisayarı ile çalışırken, sekizlik gereklidir. Sekizlik okuyabiliyorsanız, bir Word'e 20 basamak olarak bakabilirsiniz. Op kodunu iki hane temsil eder ve bir hane 8 kayıttan birini tanımlar. Makine kodlarından yüksek seviyeli dillere yavaş geçiş sırasında, programlama dillerinde sekizli formlar sağlamanın yararlı olduğu düşünülmüştür.

C'de, son derece talihsiz bir sekizlik gösterimi seçildi: Sıfır lideri. Yani, C, _0100_, 100 değil 64, _08_, 8 değil, 8 anlamına gelir. 8 değil. Ne yazık ki, bu anakronizm, JavaScript dahil, neredeyse tüm modern dillere kopyalanmıştır. hata oluşturmak için kullanılır. Başka bir amacı yok. Dolayısıyla katı modda, sekizlik formlara artık izin verilmez.

Ve benzeri

Argümanlar sözde dizi ES5'te biraz daha dizi benzeri olur. Sıkı modda, callee ve caller özelliklerini kaybeder. Bu, çok sayıda gizli bağlamdan vazgeçmeden arguments'nizi güvenilir olmayan koda geçirmenizi mümkün kılar. Ayrıca, işlevlerin arguments özelliği ortadan kaldırılmıştır.

Sıkı modda, değişmez işlevdeki yinelenen anahtarlar sözdizimi hatası oluşturur. Bir işlevin aynı ada sahip iki parametresi olamaz. Bir işlev, parametrelerinden biriyle aynı ada sahip bir değişkene sahip olamaz. Bir işlev delete 'nin kendi değişkenlerini yapamaz. delete için yapılandırılamayan bir özellik girişimi şimdi bir istisna atar. İlkel değerler örtük olarak sarılmaz.


Gelecekteki JavaScript sürümleri için ayrılmış kelimeler

ECMAScript 5, ayrılmış kelimelerin bir listesini ekler. Bunları değişken veya argüman olarak kullanırsanız, katı mod bir hata verecektir. Ayrılmış kelimeler:

implements, interface, let, package, private, protected, public, static ve yield


Daha fazla okuma

152
sampathsris

Şimdi her geliştiricinin katı modu kullanmaya başlamasını şiddetle tavsiye ediyorum. Sıkı modun yasal olarak bize kodunuzda olduğunu bile bilmediğimiz hatalardan kurtarmamıza yardımcı olacağı konusunda yeterince tarayıcı var.

Görünüşe göre, ilk aşamada daha önce hiç karşılaşmadığımız hatalar olacak. Tam olarak faydalanmak için, her şeyi yakaladığımızdan emin olmak için sıkı moda geçtikten sonra uygun testler yapmamız gerekiyor. Kesinlikle kodumuza use strict atmıyoruz ve hata olmadığını varsayıyoruz. Bu yüzden karmaşası, daha iyi kod yazmak için bu inanılmaz derecede yararlı dil özelliğini kullanmaya başlamanın zamanıdır.

Örneğin,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint , Douglas Crockford tarafından yazılmış bir hata ayıklayıcıdır. Komut dosyasına yapıştırmanız yeterlidir; kodunuzda farkedilebilecek sorunları ve hataları hızla tarar.

128
Pank

Diğer cevapları tamamlayan biraz daha köklü bir cevap sunmak istiyorum. En popüler yanıtı düzenlemeyi umuyordum, ancak başarısız oldum. Yapabildiğim kadar kapsamlı ve eksiksiz yapmaya çalıştım.

Daha fazla bilgi için MDN belgelerine bakınız.

- KODE - ECMAScript 5'te sunulan bir yönerge.

Direktifler ifadelere benzer, ancak farklıdır.

  • "use strict" anahtar kelimeler içermez: Yönerge, özel bir dize değişmezinden oluşan (tek veya çift tırnak içinde) basit bir ifade ifadesidir. ECMAScript 5'i uygulamayan JavaScript motorları, yalnızca yan etkisi olmayan bir ifade ifadesi görür. ECMAScript standartlarının gelecekteki sürümlerinin gerçek bir anahtar kelime olarak --VARIABLE - 'ı getirmesi beklenir; alıntılar böylece eski hale gelirdi.
  • --CODE - sadece bir betiğin başında veya bir fonksiyonun başında kullanılabilir, yani her diğer (gerçek) ifadeden önce gelmelidir. Bir fonksiyon betiğindeki ilk komut olmak zorunda değildir: dize değişmezlerinden oluşan diğer ifadelerden önce gelebilir (ve JavaScript uygulamaları bunları uygulamaya özel yönergeler olarak kabul edebilir). İlk gerçek ifadeyi izleyen (bir komut dosyasında veya işlevde) dize değişmez ifadeleri basit ifade ifadeleridir. Tercümanlar bunları yönerge olarak yorumlamamalı ve hiçbir etkisi yoktur.

use strict yönergesi, aşağıdaki kodun (bir komut dosyasında veya bir fonksiyonda) katı kod olduğunu belirtir. • Bir komut dosyasının en üst düzeyindeki kod (bir işlevde olmayan kod), katı kod olarak kabul edilir. betiği bir use strict yönergesi ..__ içeriyor Bir fonksiyonun içeriği, fonksiyonun kendisi katı bir kodla tanımlandığında ya da bir use strict yönergesi ..__ Kodunu içerdiğinde, kodun kodu olarak kabul edilir. eval() yöntemine geçirilen, eval() katı bir koddan çağrıldığında veya use strict yönergesinin kendisini içerdiğinde katı kod olarak kabul edilir.

ECMAScript 5'in katı modu, dilin ilgili açıklarını ortadan kaldıran ve daha katı hata denetimi ve daha yüksek güvenlik özellikleri içeren, JavaScript dilinin sınırlı bir alt kümesidir. Aşağıda katı mod ile normal mod arasındaki farklar listelenmiştir (ilk üçü özellikle önemlidir):

  • use- deyimini katı modda kullanamazsınız.
  • Sıkı modda tüm değişkenler bildirilmelidir: değişken, işlev, işlev parametresi, catch-clause parametresi veya global with öğesinin özelliği olarak bildirilmemiş bir tanımlayıcıya bir değer atarsanız, bir değişken--. Normal modda, tanımlayıcı dolaylı olarak global bir değişken (global Object) bir özelliği olarak bildirilir.
  • Katı modda ReferenceError anahtar sözcüğü, işlevler olarak çağrılan işlevlerde (yöntem olarak değil) Object değerine sahiptir. (Normal modda this her zaman global undefined 'yı işaret eder). Bu fark, bir uygulamanın katı modu destekleyip desteklemediğini test etmek için kullanılabilir:
use strict
  • Ayrıca bir işlev call() veya this ile katı modda çağrıldığında, o zaman Object, call() veya apply() çağrısının ilk argümanının değeridir. (Normal modda apply ve this global null ile değiştirilir ve nesneler olmayan değerler nesnelere dökülür.)

  • Katı modda, salt okunur özelliklere atamaya çalıştığınızda veya genişletilemeyen bir nesne için yeni özellikler tanımlamaya çalıştığınızda bir undefined elde edersiniz. (Normal modda her ikisi de sadece hata mesajı olmadan başarısız olur.)

  • Sıkı modda, kodu eval() konumuna geçirirken, arayanın kapsamındaki değişkenleri veya işlevleri tanımlayamaz veya tanımlayamazsınız (normal modda yapabileceğiniz gibi). Bunun yerine, eval() için yeni bir kapsam oluşturulur ve değişkenler ve işlevler bu kapsam dahilindedir. Bu kapsam, eval() yürütmeyi bitirdikten sonra imha edilir.
  • Katı modda, bir işlevin argümanları-nesnesi, o işleve iletilen değerlerin statik bir kopyasını içerir. Normal modda, argümanlar-nesnesi biraz "sihirli" davranışa sahiptir: Dizinin elemanları ve adlandırılmış işlev parametreleri, aynı değere başvurur.
  • Katı modda, Object işlecini kalifiye olmayan bir tanımlayıcı (değişken, işlev veya işlev parametresi) takip ettiğinde TypeError elde edersiniz. Normal modda SyntaxError ifadesi hiçbir şey yapmaz ve delete olarak değerlendirilir.
  • Katı modda, yapılandırılamayan bir özelliği silmeye çalıştığınızda delete alırsınız. (Normal modda deneme basit bir şekilde başarısız olur ve false ifadesi TypeError olarak değerlendirilir).Katı modda, bir nesne değişmezi için aynı adda birkaç özellik tanımlamaya çalıştığınızda sözdizimsel bir hata olarak kabul edilir. (Normal modda hata yoktur.).
  • Sıkı modda, bir işlev bildiriminin aynı ada sahip birden fazla parametresi olduğunda, sözdizimsel bir hata olarak kabul edilir. (Normal modda hata yoktur.)
  • Katı modda, sekizli değişmezlere izin verilmez (bunlar use strict ile başlayan değişmezlerdir. (Normal modda bazı uygulamalar sekizli değişmezlere izin verir).
  • Katı modda delete ve false tanımlayıcıları anahtar kelimeler gibi değerlendirilir. Değerlerini değiştiremezsiniz, bunlara değer atayamazsınız ve bunları değişkenler, işlevler, işlev parametreleri veya catch bloğunun tanımlayıcıları için ad olarak kullanamazsınız.
  • Sıkı modda arama yığınını inceleme olanakları üzerinde daha fazla kısıtlama vardır. var hasStrictMode = (function() { "use strict"; return this===undefined }()); ve 0x, sıkı modda bir işlevde eval neden olur. Ayrıca, katı moddaki bazı arayan- ve argüman özellikleri, okumaya çalıştığınızda bir arguments ye neden olur.
  • In strict mode are more restrictions on the possibilities to examine the call stack. arguments.caller and arguments.callee cause a TypeError in a function in strict mode. Furthermore, some caller- and arguments properties of functions in strict mode cause a TypeError when you try to read them.
88
Ely

İki sentim:

Sıkı modun amaçlarından biri, sorunların daha hızlı hata ayıklamasına izin vermektir. Web sitenizde sessiz ve garip davranışlara neden olabilecek bazı yanlış şeyler meydana geldiğinde istisna atarak geliştiricilere yardımcı olur. use strict kullandığımız an, kod geliştiricinin önceden düzeltmesine yardımcı olan hataları atar.

use strict kullandıktan sonra öğrendiğim birkaç önemli şey:

Küresel Değişken Beyanını Önler:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

Şimdi, bu kod, global kapsamda window.nameoftree kullanılarak erişilebilecek nameoftree öğesini oluşturur. use strict öğesini uyguladığımızda, kod hata verirdi.

Yakalanmamış ReferenceError: Nameoftree tanımlanmadı

Sample

with deyimini ortadan kaldırır:

with deyimleri glify-js gibi araçlar kullanılarak küçültülemez. Ayrıca kullanımdan kaldırıldı ve gelecekteki JavaScript sürümlerinden kaldırıldılar.

Sample

Yinelemeleri Önler:

Yinelenen özelliğimiz olduğunda, bir istisna atar

Yakalanmamış SyntaxError: Nesne değişmezindeki yinelenen veri özelliği katı modda kullanılmıyor

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

Çok az var ama bu konuda daha fazla bilgi edinmem gerekiyor.

80
Shubh

Geçen yıl yayınlanan bir tarayıcı kullanıyorsanız, o zaman büyük olasılıkla JavaScript Sıkı modunu destekler. ECMAScript 5 mevcut standart olmadan önce sadece eski tarayıcılar bunu desteklemiyor. 

Komutun etrafındaki alıntılar, kodun hala eski tarayıcılarda da çalışacağından emin olmanızı sağlar (sıkı modda bir sözdizimi hatası oluşturan şeyler genellikle sadece eski tarayıcılarda tespit etmesi zor bir şekilde komut dosyasının arızalanmasına neden olur).

57
Stephen

"use strict"; eklerken, aşağıdaki durumlar komut dosyası çalıştırılmadan önce SyntaxError atacaktır:

  • Yeni ayrılan anahtar kelimelerden birini kullanarak gelecekteki ECMAScript sürümleri için yol açın (ECMAScript 6 için geçerli olan): implements, interface, let, _ [package, private, protected, public, static ve yield.

  • Bloklarda bildirim fonksiyonu 

    if(a<b){ function f(){} }
    
  • Sekizli sözdizimi 

    var n = 023;
    
  • this global nesneyi gösterir.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • Nesne değişmezindeki bir özellik adı için aynı adı iki kez bildirmek 

     {a: 1, b: 3, a: 7} 
    

    Artık ECMAScript 6'daki durum böyle değil ( bug 1041128 ).

  • Aynı isim fonksiyonuna sahip iki fonksiyon argümanını bildirme 

    f(a, b, b){}
    
  • Bildirilmemiş bir değişkene değer ayarlama

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • delete myVariable; değişken adında delete kullanılması

  • eval veya arguments değişken veya işlev bağımsız değişken adı olarak kullanma

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    

Kaynaklar:

51
zangw

Sıkı mod, normal JavaScript anlamında birkaç değişiklik yapar:

  • bazı JavaScript sessiz hatalarını, hataları atmak için değiştirerek ortadan kaldırır.

  • javaScript motorlarının optimizasyon yapmasını zorlaştıran hataları düzeltir.

  • eCMAScript in gelecekteki tanımlanabilecek bazı sözdizimlerini yasaklar.

daha fazla bilgi için vistit Strict Mode- Javascript

50
Renganathan M G

"Sıkı Kullan"; programcının JavaScript'in gevşek veya kötü özelliklerini kullanmayacağı bir sigortadır. Bu bir rehber, tıpkı bir cetvel gibi düz çizgiler yapmanıza yardımcı olacak. "Strict Kullan", "Düz kodlama" yapmanıza yardımcı olur.

Satırlarını düz yapmak için cetvelleri kullanmamayı tercih edenler genellikle başkalarının kodlarını hata ayıklamalarını isteyen sayfalarda bulunur.

İnan bana. Genel gider, kötü tasarlanmış kod ile karşılaştırıldığında önemsizdir. Birkaç yıldan beri üst düzey bir JavaScript geliştiricisi olan Doug Crockford'un burada çok ilginç bir yayını var . Şahsen, iyi çalışmamı unutmadığımdan emin olmak için her zaman onun sitesine dönmeyi seviyorum.

Modern JavaScript uygulamasında daima "Use Strict"; Pragma. ECMA Grubunun "Sıkı" modunu isteğe bağlı yapmasının tek nedeni, daha az deneyimli kodlayıcıların JavaScript'e erişmesine izin vermek ve daha sonra yeni ve daha güvenli kodlama uygulamalarına uyum sağlamak için zaman vermek.

48
user2436758

use strict 'yu tüm hassas JavaScript dosyalarınızın başına bu noktadan eklemek, daha iyi bir JavaScript programcısı olmanın ve rasgele değişkenlerin global hale gelmesini engellemenin ve her şeyin sessizce değişmesinin küçük bir yoludur.

44
Placeholder

w3schools'dan alıntı yapma :

"Sıkı Kullan" Yönergesi

"Use strict" yönergesi JavaScript 1.8.5'te (ECMAScript Sürüm 5) yenidir.

Bu bir ifade değil, daha önce geçenler tarafından yok sayılan gerçek bir ifadedir. JavaScript sürümleri.

"Sıkı kullan" ın amacı, kodun .__ olması gerektiğini belirtmektir. "sıkı modda" yürütüldü.

Katı modda, örneğin bildirilmemiş değişkenleri kullanamazsınız.

Neden Sıkı Modu?

Sıkı mod, "güvenli" JavaScript yazmayı kolaylaştırır.

Sıkı mod değişiklikleri daha önce kabul edilen "kötü sözdizimini" gerçek hatalara dönüştürdü.

Örnek olarak, normal JavaScript'te, bir değişkenin ismini yanlış yazmak, yeni bir global değişken. Sıkı modda, bu bir hataya yol açacaktır, yanlışlıkla bir global değişken oluşturmayı imkansız hale getirir.

Normal JavaScript'te, bir geliştirici hata geri bildirimi almayacaktır. yazılabilir olmayan özelliklere değer atamak.

Katı modda, yazılamaz bir özelliğe yapılan herhangi bir atama, a yalnızca getter mülkü, var olmayan mülk, var olmayan mülk. değişken veya var olmayan bir nesne bir hata verecektir.

Lütfen http://www.w3schools.com/js/js_strict.asp adresini ziyaret edin.

36
Mehul Singh

"use strict", JavaScript kodunun katı modda çalışmasını sağlar; bu, kullanımdan önce her şeyin tanımlanması gerektiği anlamına gelir. Sıkı modu kullanmanın temel nedeni, tanımlanmamış yöntemlerin yanlışlıkla global kullanımından kaçınmaktır.

Ayrıca katı modda, işler daha hızlı çalışır, bazı uyarılar veya sessiz uyarılar ölümcül hatalar atar, daha düzenli bir kod yapmak için her zaman kullanmak daha iyidir.

"use strict" ECMA5'te, ECMA6'da varsayılan olarak JavaScript'in bir parçası olarak kullanılmalıdır , bu nedenle eklenmesi gerekmez ES6 kullanıyorsanız.

Bu ifadelere ve MDN'den örneklere bakın:

"Sıkı kullanın" Yönergesi
"Use strict" yönergesi JavaScript 1.8.5'te (ECMAScript sürüm 5) yenidir. Bu bir ifade değil, önceki sürümlerde JavaScript tarafından yok sayılan bir ifadedir. "Sıkı kullan" ın amacı, kodun "katı modda" yürütülmesi gerektiğini belirtmektir. Katı modda, örneğin bildirilmemiş değişkenleri kullanamazsınız.

"use strict" kullanımına örnekler:
Fonksiyonlar için katı mod: Aynı şekilde, bir fonksiyon için katı modu çağırmak için, tam ifadesini "use strict"; (ya da 'use strict';) herhangi bir başka ifadeden önce işlevin vücudunda.

1) işlevlerde katı mod

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) tam komut dosyası katı modu

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) Yazılabilir olmayan bir global atama

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

Sen MDN daha fazla ok yapabilirsiniz.

34
Alireza

ECMAScript komitesinde yer alan bazı kişilerce iyi bir konuşma var: JavaScript’te yapılan Değişiklikler, Bölüm 1: ECMAScript 5 " / "use strict" anahtarının artımlı kullanımının JavaScript uygulayıcılarının JavaScript’in tehlikeli özelliklerinin çoğunu temizlemesini sağlaması aniden dünyadaki her web sitesini kırmadan.

Tabii ki, aynı zamanda bu yanlış özelliklerin ne kadarının (olduğu) ve ECMAScript 5'in onları nasıl düzelttiği hakkında da konuşuyor.

29
FutureNerd

use strictEcmaScript 5 'de tanıtıldı ve o zamandan beri tutuldu.

Aşağıda ES6 ve ES7 öğelerinde katı modu tetikleme koşulları vardır:

  • Genel kod, Sıkı Kullanım Direktifi içeren bir Yönergenin Prologuyla başlıyorsa katı mod kodudur (bkz. 14.1.1).
  • Modül kodu her zaman katı mod kodudur.
  • Bir _/ClassDeclaration veya bir ClassExpression 'ın tüm bölümleri katı mod kodudur.
  • Değerlendirme kodu, Sıkı Kullanım Yönergesi içeren bir Yöner Prolog ile başlıyorsa veya eval'e yapılan çağrı, katı mod kodunda bulunan doğrudan bir değerlendirme (bkz. 12.3.4.1) ise katı mod kodudur.
  • İşlev kodu, katı mod kodunda ilişkili FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition veya ArrowFunction öğesi içeriyorsa veya fonksiyonun [[ECMAScriptCode]] dahili yuvasının değerini üreten kod başlıyorsa, sıkı mod kodudur. Kullanım Sıkı Yönergesi içeren bir Yönerge ile.
  • Yerleşik İşlev ve Jeneratör yapıcılarına argüman olarak verilen işlev kodu, son argüman işlendiğinde bir Sıkı Direktif Kullanma içeren bir Direktif Prologuyla başlayan bir FunctionBody olan bir Dize ise katı mod kodudur. .
18
Oriol

Karşılaştırılacak küçük örnekler:

Sıkı olmayan mod:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

Sıkı modu:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

Sıkı olmayan mod:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true

16
Foo

Geliştiricilerin "use strict" kullanmasının temel nedenleri şunlardır:

  1. Global değişkenlerin yanlışlıkla bildirilmesini önler. "use strict()" işlevinin kullanılması, değişkenlerin kullanmadan önce var ile bildirildiğinden emin olmanızı sağlar. Örneğin:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    
  2. Not: "use strict" yönergesi sadece bir betiğin veya fonksiyonun başında tanınır.
  3. "arguments" dizgisi değişken olarak kullanılamaz:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. Anahtar kelimelerin kullanımını değişken olarak kısıtlayacaktır. Onları kullanmaya çalışmak hatalar verecektir.

Kısacası kodunuzu daha az hata eğilimli hale getirecek ve sırayla iyi kod yazmanızı sağlayacaktır.

Bununla ilgili daha fazla bilgi için here adresini ziyaret edebilirsiniz.

11
Pritam Banerjee

"sıkı kullan"; JavaScript’i biraz daha güçlü hale getirme çabası ECMA’dır. JS'ye en azından biraz "katı" yapma çabası getirir (diğer diller 90'lardan bu yana katı kurallar uygular). Aslında, JavaScript geliştiricilerini bir tür kodlama en iyi uygulamalarını izlemeye "zorlar" .. Yine de, JavaScript çok kırılgan. Yazılan değişkenler, yazılan yöntemler, vb. Gibi bir şey yoktur. hata ayıklamak daha kolay.

10
PippoApps.com

use strict, kodunuzu daha güvenli hale getirmenin bir yoludur, çünkü beklediğiniz gibi çalışmayan tehlikeli özellikleri kullanamazsınız. Ve kodu daha katı hale getirmeden önce yazıldığı gibi.

Sıkı Kullan, genel ve tekrarlanan hataları göstermek için kullanılır, böylece farklı şekilde ele alınır ve Java komut dosyasının çalışma biçimini değiştirir, bu değişiklikler şunlardır:

  • Kazara globals'ı önler

  • Kopya yok

  • İle ortadan kaldırır

  • Bu zorlamayı ortadan kaldırır

  • Daha güvenli eval ()

  • Değişmezler için hatalar

ayrıca bunu okuyabilirsiniz makale

10
Wesam

Normalde, JavaScript katı kurallara uymaz, bu nedenle hata şansını arttırır. "use strict" kullandıktan sonra, JavaScript kodu, sonlandırıcıların kullanımı, başlatmadan önceki bildirim gibi diğer programlama dillerinde olduğu gibi katı kurallar dizisini izlemelidir. 

"use strict" kullanılıyorsa, kurallar katı bir kurallar dizisi izlenerek yazılmalıdır, bu nedenle hata ve belirsizlik olasılığını azaltır.

9
Bikash Chapagain

JavaScript “katı” modu ECMAScript 5'te tanıtıldı.

(function() {
  "use strict";
  your code...
})();

"use strict"; dosyasının JS dosyanızın en üstüne yazılması katı Sözdizimi kontrolünü açar. Bizim için aşağıdaki görevleri yapar:

  1. bildirilmemiş bir değişkene atamaya çalışırsanız hata gösterir.

  2. anahtar JS sistem kitaplıklarının üzerine yazmanızı engeller

  3. bazı güvenli olmayan veya hataya açık dil özelliklerini yasaklar

use strict ayrıca bireysel işlevlerin içinde de çalışır. Kodunuza use strict eklemek her zaman daha iyi bir uygulamadır.

Tarayıcı uyumluluğu sorunu: "Kullanım" yönergelerinin geriye dönük olarak uyumlu olması amaçlanmıştır. Onları desteklemeyen tarayıcılar yalnızca daha fazla başvuruda bulunmayan bir dize değişkeni görecektir. Böylece, üstünden geçip devam edecekler.

8
Rabin Pantha

Sıkı mod, bellek sızıntılarını önleyebilir.

Lütfen katı olmayan modda yazılmış aşağıdaki işlevi kontrol edin:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

Bu fonksiyonda, fonksiyon içerisinde name adlı bir değişken kullanıyoruz. Dahili olarak, derleyici ilk önce o belirli fonksiyon kapsamında bu isimle belirtilen bir değişken olup olmadığını kontrol edecektir. Derleyici böyle bir değişken olmadığını anladığından, dış kapsamda kontrol eder. Bizim durumumuzda küresel kapsamdır. Yine, derleyici, aynı zamanda bu alanda küresel alanda ilan edilmiş bir değişken olmadığını da anladı, bu yüzden bizim için küresel alanda böyle bir değişken yarattı. Kavramsal olarak, bu değişken küresel kapsamda yaratılacak ve tüm uygulamada mevcut olacak.

Başka bir senaryo, değişkenin bir çocuk fonksiyonunda bildirildiğidir. Bu durumda, derleyici bu değişkenin geçerliliğini dış kapsamdaki, yani ana işlevdeki kontrol eder. Ancak o zaman küresel uzayı kontrol edecek ve bizim için orada bir değişken yaratacaktır. Bu, ek kontrollerin yapılması gerektiği anlamına gelir. Bu, uygulamanın performansını etkileyecektir.


Şimdi aynı işlevi katı modda yazalım.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

Aşağıdaki hatayı alacağız.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

Burada, derleyici referans hatası veriyor. Sıkı modda, derleyici, değişkeni bildirmeden kullanmamıza izin vermez. Böylece hafıza sızıntıları önlenebilir. Ayrıca daha iyi kod yazabiliriz.

1

"sıkı kullan"; JavaScript kodunun İçinde çalıştırılması gerektiğini tanımlar. "katı mod".

  • ECMAScript sürüm 5’te "use strict" yönergesi yeniydi.
  • Bu bir ifade değil, daha önceki bir JavaScript ifadesidir.
  • "Katı kullan" ın amacı, kodun "katı modda" çalıştırılması gerektiğini belirtmektir.
  • Katı modda, örneğin bildirilmemiş değişkenleri kullanamazsınız.

Tüm modern tarayıcılar, Internet Explorer 9 ve daha düşükleri hariç "katı kullanımı" destekler.

Dezavantaj

Bir geliştirici katı modda bir kitaplık kullandıysa, ancak geliştirici normal modda çalışıyorsa, kitaplıkta beklendiği gibi çalışmayan bazı eylemler çağırabilirdi.

Daha kötüsü, geliştirici normal modda olduğundan, fazladan hataların atılma avantajları yoktur, bu nedenle hata sessizce başarısız olabilir.

Ayrıca, yukarıda listelendiği gibi, katı mod bazı şeyleri yapmanıza engel olur.

İnsanlar genellikle bu şeyleri ilk başta kullanmamanız gerektiğini düşünür, ancak bazı geliştiriciler kısıtlamayı sevmez ve dilin tüm özelliklerini kullanmak ister.

0
ashish

Çok basit olmak için "sıkı kullan"; JS dosyanızın en üstünde sıkı bir sözdizimi denetimi açar.

1: -Bu bildirilmemiş bir değişkene atamaya çalışacağınızı beyan etmenize izin vermeyecek, bir hata gösterecektir. 2: -Bu güvenli olmayan veya hataya açık dil özelliklerini yasaklar.

function abc() { "use strict"; your code... };

0
Abhijeet Singh