Soru Javascript'te “kullanımı sıkı” ne yapar ve bunun arkasında yatan sebep nedir?


Son zamanlarda, Crockford'un bazı JavaScript kodlarını çalıştırdım. JSLintve aşağıdaki hatayı verdi:

1. satırda sorun 1 karakter: Eksik "kullanın" ifadesi.

Bazı arama yaparken, bazı kişilerin eklediğini fark ettim "use strict"; JavaScript kodlarına İfadeyi ekledikten sonra hata görünmeyi durdurdu. Maalesef, Google bu dize ekstresinin ardındaki tarihin çoğunu açıklamadı. Kesinlikle JavaScript'in tarayıcı tarafından nasıl yorumlandığıyla ilgili bir şey olmalı, ancak etkinin ne olacağı hakkında hiçbir fikrim yok.

Öyleyse ne "use strict"; tüm bunlar, neyi ima eder, ve hala geçerli midir?

Mevcut tarayıcılardan herhangi birine yanıt veriyor "use strict"; dize veya gelecekteki kullanım için mi?


6712
2017-08-26 16:10


Menşei




Cevaplar:


Javascript Strict Mode ile ilgili bu makale ilginizi çekebilir: John Resig - ECMAScript 5 Sıkı Mod, JSON ve Daha Fazlası

Bazı ilginç parçaları alıntılamak için:

Sıkı Mod, ECMAScript 5'teki bir programı veya bir işlevi "sıkı" bir çalışma bağlamında yerleştirmenize izin veren yeni bir özelliktir. Bu sıkı bağlam, belirli eylemlerin alınmasını engeller ve daha fazla istisna atar.

Ve:

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

  • Bazı ortak kodlayıcı blooperleri yakalar, istisnalar atar.
  • Nispeten "güvenli olmayan" eylemler alındığında (genel nesneye erişim kazanma gibi) hataları önler veya atar.
  • Kafa karıştırıcı veya kötü düşünülmüş özellikleri devre dışı bırakır.

Ayrıca tüm dosyaya "sıkı mod" uygulayabildiğinize dikkat edin ... Ya da sadece belirli bir işlev için kullanabilirsiniz (hala John Resig'in makalesinden alıntı):

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

Eski ve yeni kodu karıştırmak gerekirse, yararlı olabilir ;-)

Yani, sanırım biraz "use strict" Perl'de kullanabilirsiniz (bu yüzden isim?): Kırılmaya neden olabilecek daha fazla şey tespit ederek daha az hata yapmanıza yardımcı olur.

Şu anda tüm önemli tarayıcılar tarafından desteklenir  (IE 9 ve altı).


4399
2017-08-26 16:15



Uzun yıllar sonra varsayılanı değiştirmek? Bunun için çok geç: Çok fazla mevcut siteyi / betiği / uygulamayı kırıyordu ... Tek olası şey, gelecek için işleri daha iyi hale getirmektir. - Pascal MARTIN
Kullanırken geçersiz olacak küçük bir kod snippet'i denedim "use strict"Firefox 3.6, Safari 5, Chrome 7 ve Opera 10.6'da (tüm Mac). Herhangi bir hata yok, bu yüzden 'katı kullanın' henüz herhangi bir tarayıcıda desteklenmez. IE9'da test etmedi;);) - Husky
Hızlı güncelleme: Firefox 4'ün sıkı mod için tam desteği var ve anlayabildiğim kadarıyla başka bir tarayıcı yok. Safari ve Chrome'un "kısmi" desteği var, ama bunun ne anlama geldiğini gerçekten bilmiyorum. - Sasha Chedygov
Chrome 11, bu testlerin tümünü IE10 gibi geçiyor gibi görünüyor ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html# - gman
@Julius - Bu, rezerve edilmiş bir anahtar kelime kullanılarak gerçekleştirilemedi, çünkü katı modunu tetiklemeye çalışan kod eski tarayıcılarda bozulur. "Rastgele" bir dizgi değişmezi eklemek hiçbir şeyi kırmaz. - nnnnnn


ECMAScript 5'in yeni bir özelliği. John Resig yazdı güzel bir özet onun.

Bu, JavaScript dosyalarınıza koyduğunuz bir dize (dosyanızın en üstünde veya bir işlevin içinde) şöyle görünür:

"use strict";

Kodunuza koymanız, şimdiki tarayıcılarda yalnızca bir dize olduğu için herhangi bir soruna neden olmamalıdır. Kodunuz pragmayı ihlal ediyorsa, gelecekte kodunuzda sorunlara neden olabilir. Örneğin, şu anda foo = "bar" tanımlamaksızın foo İlk olarak, kodunuz başarısız olmaya başlayacak ... ki bence bu iyi bir şey.


1103
2017-08-26 16:14



Hızlı başarısız ve yüksek sesle başarısız. - Niels Bom
Javascript'i HTML dosyalarına satır içi yazıyorsanız, her yeni bloğu <script>"use strict";. Bayrak sadece dahil edildiği blok için geçerlidir. - nobar
Bu komik, sonuçta dizelerin tek tırnak işareti olması gerekiyordu. Öyleyse yaz 'use strict'; yerine - nilsi
o zaman javascript kaldırma kavramına ne olurdu? - Sunil Sharma
@SunilSharma Kaldırmaya çalışırsanız, ancak değişken tanımlanmadığı için başarısız olur, şu anda global nesnesine ekleyecektir. İle "use strict";bunun yerine başarısız olur. Bu daha mantıklıdır, çünkü eğer global nesneye ekliyorsa, bu fonksiyon bir sonraki çalıştırmanızda işe yaramayacağı anlamına gelir / bloğu sıfırlayan başka bir şey yapın, çünkü en yüksek blokta (global) olacaktır. - wizzwizz4


İfade "use strict"; Tarayıcıya, indirgenmiş ve daha güvenli bir JavaScript kümesi olan Sıkı modu kullanmasını bildirir.

Özelliklerin listesi (kapsamlı olmayan)

  1. Global değişkenlere izin vermez. (Yakalananlar eksik var değişken isimlerde beyanlar ve yazım hataları

  2. Sessiz başarısız ödevler katı modda hata atar (atama NaN = 5;)

  3. Silinemez özelliklerin silinmesi girişimleri (delete Object.prototype)

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

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

  6. Sekizlik sözdizimini yasaklar (var x = 023; Bazı devreler yanlış bir şekilde, bir önceki sıranın sayıyı değiştirmek için hiçbir şey yapmadığını varsayarlar.)

  7. Yasaklar with anahtar kelime

  8. eval sıkı modda yeni değişkenler tanıtmaz

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

  10. Adların bağlanmasını veya atanmasını yasaklar eval ve arguments Herhangi bir biçimde

  11. Sıkı mod, diğer arguments resmi parametrelerle nesne. (ör. function sum (a,b) { return arguments[0] + b;} Bu çünkü arguments[0] bağlı a ve bunun gibi. )

  12. arguments.callee desteklenmiyor

[Ref: Sıkı mod, Mozilla Geliştirici Ağı]


519
2017-11-24 21:22



Nit: global değişkenlere izin verilir, sadece açık olmalıdır (ör. window.foo = bar). - gcampbell
Bir nesne değişmezindeki tüm özellik adlarının benzersiz olması gerekir (var x = {x1: "1", x1: "2"}) bu geçerli - Arun Killu
11'deki örneğinizde bir değişiklik yok (aksi halde anlam ifade etmiyor). I. e. fonksiyon toplamı (a, b) {a = 0; geri dönüş argümanları [0] + b; } uyarısı (toplam (1, 2)) 3 katı mod ve katı mod olmadan 2, aliasing nedeniyle geri dönecektir. - David Gausmann
# 6 ile birkaç saat hata ayıkladım - jazzcat


İnsanlar kullanmaktan endişe ediyorlarsa use strict Bu makaleyi incelemeye değer olabilir:

ECMAScript 5 'Sıkı mod' tarayıcılarda destek. Ne anlama geliyor?
NovoGeek.com - Krishna'nın web günlüğü

Tarayıcı desteği hakkında konuşuyor, ancak daha önemlisi bununla nasıl başa çıkılacağını anlatıyor:

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.
*/

369
2017-07-15 23:25



Katılmıyorum. Bunun neden çok yararlı olduğunu düşünüyorum. Özünde, bunun işlevini döndürdüğü anlamına gelir. window - Jamie Hutber
pencereyi ne zaman istersen this hedefleyemediğin window? - Jamie Hutber
Kendisine atıfta bulunur. this global pencereye değil kendi işlevine aittir - Jamie Hutber
İkincisinde this aslında bir undefined. - Broxzier
Önemli olan nokta, JS programınızın tanımlanamayan bir özelliğe erişmesi nedeniyle başarısız olmaya başlamasıdır. İnce hataları takip etmeyi çok daha kolaylaştırır. - Stephen Chung


Dikkatli bir kelime, tüm programcıları şarj ediyorsunuz: uygulama "use strict" mevcut kodlara tehlikeli olabilir! Bu şey, 'daha iyi' yapmak için kod üzerinde tokat atabileceğiniz, iyi hissettiren, mutlu bir yüz etiketi değil. İle "use strict" pragma, tarayıcının aniden rasgele yerlerde istisnalar atmadan önce asla attı asla çünkü o anda bir şey yapıyorsun varsayılan / gevşek JavaScript izin veriyor ama sıkı JavaScript nefret! Kodunuzda nadiren kullanılan aramalarda saklanan, ancak sonunda ödeme yapan müşterilerinizin kullandığı üretim ortamında, sadece bir istisna atacağınız kesin ihlalleri olabilir.

Eğer dalma yapacaksanız, uygulamak iyi bir fikirdir. "use strict" Kapsamlı birim testleri ve sıkı bir şekilde yapılandırılmış bir JSHint derleme görevi yanında, modülünüzün karanlık köşesi olmadığından emin olun. Ya da hey, başka bir seçenek: sadece eklemeyin "use strict" Eski kodunuzun herhangi birine, muhtemelen bu şekilde daha güvenlidir. KESİNLİKLE YAPMAYIN eklemek "use strict" Üçüncü parti modüller gibi sahip olmadığınız veya bakımını yapmadığınız tüm modüllere.

Bence ölümcül bir kafesli hayvan olsa da, "use strict" iyi şeyler olabilir, ama doğru yapmak zorundasın. Katılaşmanın en iyi zamanı, projenizin yeşil alan olduğu ve sıfırdan başladığınız zamandır. Yapılandır JSHint/JSLint tüm uyarılar ve seçenekleri ile takımınız mide kadar sıkı krank, gibi iyi bir yapı / test / assert sistemi du jour olsun Grunt+Karma+Chaive sadece THEN tüm yeni modüllerinizi "use strict". Çok sayıda kusurlu hataları ve uyarıları iyileştirmeye hazır olun. Herkesin yapıyı FAIL olarak yapılandırarak yerçekimini anladığından emin olun. JSHint/JSLintherhangi bir ihlal oluşturur.

Benim projem kabul edildiğinde yeşil alan projesi değildi. "use strict". Sonuç olarak, IDE'm kırmızı işaretlerle dolu çünkü bende yok. "use strict" modüllerin yarısında ve JSHint bundan şikayet ediyor. Gelecekte ne yapmam gerektiğini refactoring hakkında bir hatırlatma. Amacım kayıplarımın tamamı yüzünden kırmızı renkli olmaktır "use strict" İfadeler, ama şimdi yıllardır.


182
2018-03-03 07:37



NEDEN bu iş parçacığı devleri vardır "kullanımı sıkı" hakkında daha çok şövalye ?? İçinde ÜÇÜNCÜ aksi halde JavaScript çalışıyorAllah aşkına! Sadece mısır gevreği gibi şeker üzerine koyarsın, ha? YOK HAYIR! KÖTÜ! "kesinlikle kullanın" dikkatli bir şekilde kullanılmalıdır, tercihen yalnızca tüm önemli tarayıcılara karşı gelen ve tüm kod yollarını kullanan birim testleri olan kodlarda kontrol edin. Testin var mı? Tamam, "sıkı kullanın" sizin için iyi, kendinizi yıkın. - DWoldrich
Evet. Açıkça "katı kullanın", daha önce kırılmayan görünüşte geçerli javascript kırılabilir. Ancak, daha önce kırılmayan kod, kodun doğru olması ve yapması gereken şeylere eşit değildir. Genellikle beyan edilmeyen değişkenlere atıfta bulunmak bir yazım hatası, vb. Sinyalleri verir. Sıkı kullanım, bu tür hataları yakalamanıza ve üretim kodunu göndermeden önce umarız. - Jostein Kjønigsen
... ya da sadece "kullanın sıkı" kod üzerinde son geçişin bir parçası olarak uygulamak, tüm bariz sorunları düzeltmek, silkmek, "yeterince iyi" deyin, sonra üretim için dışarı çıkar :) - Wolfie Inu
Şahsen ben asla / çok nadiren eklemek  "use strict"; mevcut koda. Bu söyleniyor ki, sıfırdan yeni kod yazarken neredeyse her zaman kullanacağım - Martin
Zaten JSLint kullanıyorsanız, muhtemelen "kullanımı sıkı" olan şeylerin kırılacağı yerlerin çoğunu da giderdiniz. - Jonathan Cast


kullanma 'use strict'; aniden kodunuzu daha iyi hale getirmez.

JavaScript sıkı mod içinde bir özellik ECMAScript 5. Bunu, komut dosyanızın / işlevinizin üstünde bildirerek kesin modunu etkinleştirebilirsiniz.

'use strict';

Bir JavaScript motoru bunu gördüğünde direktifkodu özel bir modda yorumlamaya başlayacaktır. Bu modda, potansiyel hataların ortaya çıkmasına neden olabilecek bazı kodlama uygulamaları (katı modun ardındaki sebepler) tespit edildiğinde hatalar ortaya çıkar.

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

var a = 365;
var b = 030;

Sayısal değişmezleri sıraya dizme takıntısında, geliştirici yanlışlıkla başlatılmış değişkeni b bir sekizli literal ile. Sıkı olmayan mod bunu değeri ile sayısal bir literal olarak yorumlayacaktır 24 (10 bazında). Ancak, sıkı mod bir hata atar.

Sıkı modda kapsamlı olmayan bir uzman listesi için bkz. bu cevap.


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

  • Benim .. De yeni JavaScript uygulaması: Kesinlikle! Kodunuzla aptalca bir şey yaptığınızda, sıkı mod bir ihbarcı olarak kullanılabilir.

  • Benim .. De mevcut JavaScript kodu: Muhtemelen değil! Mevcut JavaScript kodunuz sıkı modda yasaklanmış ifadelere sahipse, uygulama sadece kırılır. Eğer sıkı mod istiyorsanız, mevcut kodunuzu ayıklamaya ve düzeltmeye hazır olmalısınız. Bu nedenle kullanma 'use strict'; aniden kodunuzu daha iyi yapmaz.


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

  1. Ekle 'use strict'; komut dosyanızın üstünde açıklama:

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

    Dosyadaki her şeyin olduğuna dikkat edin myscript.js sıkı modda yorumlanacaktır.

  2. Veya 'use strict'; fonksiyon gövdesinin üstündeki ifade:

    function doSomething() {
        'use strict';
        ...
    }
    

    Her şey sözcük kapsamı işlev doSomething sıkı modda yorumlanacaktır. Kelime sözcük kapsamı burada önemli. Görmek bu cevap daha iyi bir açıklama için.


Katı modda ne gibi şeyler yasaklanmıştır?

Bir ... buldum güzel yazı katı modda yasaklanan birkaç şeyi açıklamak (bunun özel bir liste olmadığını unutmayın):

kapsam

Tarihsel olarak, JavaScript nasıl işlevler konusunda kafa karıştırdı   kapsamlıdır. Bazen statik olarak kapsamlıdırlar, ancak bazıları   özellikler, dinamik olarak kapsamlandıkları gibi davranırlar. Bu   kafa karıştırıcı, programları okumayı ve anlamayı zorlaştırıyor.   Yanlış anlaşılma, hatalara neden olur. Ayrıca performans için bir sorun.   Statik kapsam belirleme, derleme sırasında değişken bağlanmaya izin verir   zaman, ancak dinamik kapsam için gereklilik, bağlayıcı olması gerektiği anlamına gelir   önemli bir performansla birlikte gelen çalışma zamanına ertelendi   ceza.

Sıkı mod, tüm değişken ciltlemenin statik olarak yapılmasını gerektirir.   Bu, daha önce dinamik bağlama gerektiren özelliklerin anlamı   ortadan kaldırılmalı veya değiştirilmelidir. Özellikle, ifadesi ile   ortadan kaldırıldı ve eval işlevinin   Arayanın ortamı ciddi şekilde kısıtlanmıştır.

Sıkı kodun faydalarından biri de YUI Kompresör   işlerken daha iyi bir iş yapabilir.

Küresel Değişkenler

JavaScript'in küresel değişkenleri var. Eğer   Bir değişkeni açıkça belirtmezseniz, global değişken   örtülü olarak sizin için ilan edildi. Bu, programlamayı daha kolay hale getirir   yeni başlayanlar, temel temizlik hizmetlerinden bazılarını ihmal edebilirler   işleri. Ama daha büyük programların yönetimini çok daha fazla yapıyor   zor ve güvenilirliği önemli ölçüde düşürür. Çok sıkı   mod, zımni küresel değişkenler artık oluşturulmuyor. Malısın   Tüm değişkenlerinizi açıkça belirtin.

Küresel Sızıntı

Sebep olabilecek bazı durumlar vardır. this   küresel nesneye bağlı olmak. Örneğin, eğer unutursanız   sağlamak new Bir yapıcı işlevini çağırırken önek,   yapıcı adlı this beklenmedik şekilde global nesneye bağlı olacak   yeni bir nesneyi başlatmak yerine, sessizce   global değişkenlerle kurcalamak. Bu durumlarda, sıkı mod   yerine bağlamak this için undefinedkurucuya neden olacak   bunun yerine bir istisna atmak, hatanın çok tespit edilmesine izin vermek   Er.

Gürültülü Arıza

JavaScript'in her zaman salt okunur özellikleri vardı, ancak siz   ES5’e kadar bunları kendiniz oluşturamadı Object.createProperty   Fonksiyon bu yeteneğe maruz kaldı. Bir değer atamaya kalkarsanız   salt okunur bir özelliğe, sessizce başarısız olur. Ödev   Mülkün değerini değiştirmezsiniz, ancak programınız şu şekilde devam eder:   Olsa da vardı. Bu programlara neden olabilecek bir bütünlük tehlikesidir.   tutarsız bir duruma girer. Katı modda, bir   salt okunur özellik bir istisna atar.

Sekizli

Sayıların sekizlik (veya taban 8) temsili aşırı derecede   kelimeleri olan makinelerde makine düzeyinde programlama yaparken yararlıdır   boyutlar 3'ün katlarıydı. CDC ile çalışırken sekizlik gerekiyordu   60 bitlik bir kelime boyutu olan 6600 mainframe. Eğer okuyabilseydin   sekizlik olarak, 20 basamaklı bir kelimeye bakabilirsiniz. İki haneli temsil   op kodu ve bir rakam 8 kayıttan birini tanımladı. Esnasında   Makine kodlarından yüksek seviyeli dillere yavaş geçiş,   programlama dillerinde sekizlik formlar sağlamak için yararlı olduğu düşünülmektedir.

C'de, sekizlik bir derece talihsiz temsil edildi   seçildi: önde gelen sıfır. Yani C’de 0100 100 değil, 64, ve 08 bir   hata, 8 değil. Daha da maalesef, bu anachronism olmuştur   JavaScript dahil olmak üzere neredeyse tüm modern dillere kopyalandı   Sadece hata oluşturmak için kullanılır. Başka amacı yok. Yani   katı mod, sekizlik formlara artık izin verilmiyor.

Et cetera

Argümanlar sözde dizi biraz daha fazla olur   ES5'te dizi benzeri. Sıkı modda, kaybeder callee ve caller   özellikleri. Bu, sizin arguments güvenilmez   Çok fazla gizli içerikten vazgeçmeden kod. Ayrıca    arguments fonksiyonların özelliği ortadan kaldırılmıştır.

Kesin modda, bir işlev değişmezindeki anahtarlar bir   sözdizimi hatası. Bir işlev aynı ada sahip iki parametreye sahip olamaz.   Bir işlev, biriyle aynı ada sahip bir değişkene sahip olamaz.   parametreleri. Bir işlev delete kendi değişkenleri. Bir girişimde bulunmak    delete Yapılandırılamayan bir özellik artık bir istisna atar. İlkel   değerler örtülü olarak sarılmamıştır.


Gelecek 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 verir. Ayrılmış kelimeler:

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


Daha fazla okuma


131
2018-01-29 11:35



bu çok güzel bir açıklama. Ancak, Angular js gibi diğer java script kütüphaneleri ile birlikte "katı" modunu kullanabileceğime dair bir şüphem var mı? - UVM
@UVM: Katı mod yönergesi sadece sözcük kapsamını etkiler. yani sadece bildirilen dosya / işlev. Eğer sahip olmayan başka bir dosya / fonksiyon varsa 'use strict' Direktif, sıkı modda çalışan bir işlevden çağrıldığında bile katı olmayan modda çalıştırılacaktır. Görmek bu kapı bir açıklama için. - Krumia
açıklaman için teşekkürler. "Sıkı" modun "yürütme" değil "yalnızca" kodu etkilediğini anlıyorum. - UVM
İkinci bakışta haklısın. Bunun sadece istisnalar attığını, ancak kodun çalışma şeklini değiştirmediğini sanmıştım. this). Şimdi görüyorum ki başka işlevleri çağırmaya başvuruyordun. - CyberEd
Sekizliin yararlı olduğu bazı durumlar vardır. Bunun için C sözdizimi korkunç, ancak dillerin yeni bir sekizli sözdizimi eklediğini ve bu sayede ön sıfır formunun kullanımdan kaldırılmasına izin verebilmeyi çok isterdim. Tabii ki, Javascript'in desteklediği lider-sıfır formunun sadece aptalca olduğu ortaya çıktı. - supercat


Her geliştiricinin şimdi sıkı mod kullanmaya başlamanızı şiddetle tavsiye ediyorum. Bunu, katı modun bizi kodunuzda bile bilmediğimiz hatalardan kurtarmaya yasal olarak yardımcı olacağını destekleyen yeterli tarayıcı var.

Görünüşe göre, ilk aşamada daha önce hiç karşılaşmadığımız hatalar olacak. Tam faydayı sağlamak için, her şeyi yakaladığımızdan emin olmak için sıkı moda geçtikten sonra uygun testler yapmamız gerekir. Kesinlikle sadece atmıyoruz use strict kodumuzda ve hiçbir hata olmadığını varsayalım. Bu nedenle, daha iyi bir kod yazmak için bu inanılmaz kullanışlı dil özelliğini kullanmaya başlama zamanı geldi.

Ö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. Sadece komut dosyasına yapıştırın ve kodunuzda fark edilebilir sorunları ve hataları hızlı bir şekilde tarar.


122
2017-07-05 19:38



@JamieHutber: Lütfen bu bağlantıyı ziyaret edin caniuse.com/use-strict  VE kangax.github.io/es5-compat-table. Tüm tarayıcı için tam bir fikir verecektir. - Pank


Diğer cevapları tamamlayan biraz daha yerleşik bir cevap sunmak istiyorum. En popüler cevabı düzenlemeyi umuyordum ama başarısız oldu. Bunu olabildiğince kapsamlı ve eksiksiz hale getirmeye çalıştım.

Referans edebilirsiniz MDN belgeleri daha fazla bilgi için.

"use strict" ECMAScript 5'te sunulan bir direktif.

Direktifler ifadelere benzer, ancak farklıdır.

  • use strict Anahtar sözcük içermez: Yönerge, özel bir dizgi değişmezinden (tek veya çift tırnak içinde) oluşan basit bir ifade ifadesidir. ECMAScript 5'i uygulamayan JavaScript motorları, yalnızca yan etki olmadan bir ifade ifadesi görür. ECMAScript standartlarının gelecek sürümlerinin tanıtılması bekleniyor use gerçek bir anahtar kelime olarak; Söz konusu alıntılar artık eskimiş olacaktı.
  • use strict sadece bir komut dosyasının veya bir işlevin başlangıcında kullanılabilir, yani diğer (gerçek) ifadelerden önce gelmelidir. Bir işlev betiğindeki ilk komut olmak zorunda değildir: Önceliği, dize değişmezlerinden oluşan diğer deyim ifadeleriyle (ve JavaScript uygulamaları bunları uygulamaya özgü yönergeler olarak ele alabilir) önlenebilir. İlk gerçek ifadeyi (bir komut dosyasında veya işlevde) izleyen dize değişmezleri ifadeleri basit ifade ifadeleridir. Tercümanlar bunları direktif olarak yorumlamamalı ve hiçbir etkisi yoktur.

use strictyönerge, aşağıdaki kodun (bir komut dosyasında veya işlevde) sıkı kod olduğunu gösterir. Kodun en yüksek düzeyindeki kod (bir işlevde olmayan kod), komut dosyası bir use strict direktif. Fonksiyonun kendisi sıkı bir kodla tanımlandığında veya bir fonksiyon içerdiğinde bir fonksiyonun içeriği sıkı kod olarak kabul edilir. use strict direktif. Bir koda geçirilen kod eval() yöntem sıkı kod olarak kabul edildiğinde eval() sıkı bir koddan çağrıldı veya use strict direktifin kendisi.

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

  • Kullanamazsın withkatı modda -statement.
  • Kesin modda tüm değişkenlerin bildirilmesi gerekir: değişken, işlev, işlev parametresi, catch-clause parametresi veya global özellik olarak bildirilmemiş bir tanımlayıcıya bir değer atarsanız Objecto zaman bir ReferenceError. Normal modda tanımlayıcı, global bir değişken olarak örtülü olarak bildirilir (globalin bir özelliği olarak) Object)
  • Katı modda anahtar kelime this değeri var undefined işlev olarak çağrılan işlevlerde (yöntem olarak değil). (Normal modda this her zaman küresel işaret eder Object). Bu fark, bir uygulamanın katı modunu destekleyip desteklemediğini test etmek için kullanılabilir:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • Ayrıca bir işlev çağrıldığında call() veya apply sıkı modda this tam olarak ilk argümanının değeridir call()veya apply() çağırma. (Normal modda null ve undefined küresel tarafından değiştirilir Object ve nesneler olmayan değerler nesneye dökülür.)

  • Katı modda bir TypeErrorreadonly özelliklerine atamaya veya genişletilemez bir nesne için yeni özellikler tanımlamaya çalıştığınızda. (Normal modda her ikisi de sadece hata mesajı olmadan başarısız olur.)

  • Katı modda, kodu geçirirken eval(), arayanın kapsamındaki değişkenleri veya fonksiyonları bildiremez veya tanımlayamazsınız (bunu normal modda yapabileceğiniz gibi). Bunun yerine, yeni bir kapsam oluşturulur eval() ve değişkenler ve fonksiyonlar bu kapsamdadır. Bu kapsam sonra yıkıldı eval() yürütmeyi bitirir.
  • Kesin modda, bir işlevin argüman nesnesi, o işleve iletilen değerlerin statik bir kopyasını içerir. Normal modda argümanlar-nesne biraz "sihirli" bir davranışa sahiptir: Dizinin elemanları ve adlandırılmış işlev parametreleri, aynı değere referans verir.
  • Katı modda bir SyntaxError ne zaman delete Operatör bir kalifiye olmayan tanımlayıcıyı (değişken, fonksiyon veya fonksiyon parametresi) takip eder. Normal modda delete İfade hiçbir şey yapmaz ve false.
  • Katı modda bir TypeError yapılandırılamaz bir özelliği silmeye çalıştığınızda. (Normal modda girişimi basitçe başarısız olur ve deleteifade değerlendirilir false).
  • Kesin modda, bir nesne değişmezi için aynı ada sahip çeşitli özellikleri tanımlamaya çalıştığınızda sözdizimsel bir hata olarak kabul edilir. (Normal modda hata yoktur.)
  • Kesin modda, işlev bildirimi aynı ada sahip birden çok parametreye sahip olduğunda sözdizimsel bir hata olarak kabul edilir. (Normal modda hata yoktur.)
  • Sıkı modda sekizli değişmezlere izin verilmez (bunlar başlangıç ​​ile başlayanlardır). 0x. (Normal modda bazı uygulamalar sekizlik literallere izin verir.)
  • Katı modda tanımlayıcılar eval ve arguments anahtar kelimeler gibi ele alınır. Değerlerini değiştiremezsiniz, onlara bir değer atamazsınız ve bunları bir catch bloğunun değişkenleri, işlevleri, işlev parametreleri veya tanımlayıcıları için kullanamazsınız.
  • Katı modda, çağrı yığınını inceleme olasılıkları üzerinde daha fazla kısıtlama vardır. arguments.caller ve arguments.callee Bir şeye sebep olmak TypeError sıkı modda bir işlevde. Dahası, sıkı modda fonksiyonların bazı arayıcı ve argüman özellikleri TypeError onları okumayı denediğinizde.

81
2018-05-15 06:58



"Katı modda sekizlik değişmezlere izin verilmez (bunlar 0x ile başlayan hazırlıklardır.)" Sekizli edebi başlı bir başlangıç ​​ile başlar 0. - Alex Gittemeier


Benim iki Sentim:

Sıkı modun amaçlarından biri, sorunların daha hızlı hata ayıklanmasını sağlamaktır. Web sayfanızın sessiz ve garip davranışlarına neden olabilecek belirli yanlış şeyler ortaya çıktığında geliştiricilere istisnalar atmanıza yardımcı olur. Kullandığımız an use strictkod, geliştiricinin önceden düzeltmesine yardımcı olan hataları atacaktır.

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

Küresel Değişken Bildirimini Ö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 oluşturur nameoftree kullanarak erişilebilen global kapsamda window.nameoftree. Uygularken use strict Kod hata attı.

Yakalanmamış ReferenceError: nameoftree tanımlı değil

Numune

Ortadan kaldırır with Beyan :

with gibi araçlar kullanılarak ifadeler minimize edilemez çirkinleştirmek-js. Onlar da kullanımdan kaldırıldı ve gelecekteki JavaScript sürümlerinden kaldırıldı.

Numune

Yinelenenleri Önler:

Yinelenen mülkümüz olduğunda, bir istisna atar

Yakalanmamış SyntaxError: Nesne değişmezinde veri özelliğini çoğaltma   sıkı modda izin verilir

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

Birkaç tane daha var ama bunun hakkında daha fazla bilgi sahibi olmam gerekiyor.


73
2018-03-10 03:31





Geçen yıl yayınlanan bir tarayıcı kullanıyorsanız veya büyük olasılıkla JavaScript Strict modunu destekliyorsa. ECMAScript 5'ten önce sadece eski tarayıcılar mevcut standart haline gelmeden bunu desteklemiyor.

Komutun etrafındaki alıntılar, kodun eski tarayıcılarda da çalışmaya devam etmesini sağlar (sıkı modda bir sözdizimi hatası oluşturan şeyler genellikle betiğin eski tarayıcılarda yolunu algılamak için zor olmasına neden olur).


54
2018-03-27 12:18



O zaman ne yapar? - Anish Gupta
... bu tarif kısmen uyumluluk, ama aslında ne yapar. - courtsimas