JavaScript’te "katı kullanımı" ne yapar ve bunun nedenleri nelerdir?

Geçenlerde JavaScript kodumu Crockford JSLint aracılığıyla başlattım ve aşağıdaki hatayı verdi:

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

Bazı aramalar yaparken, bazı kişilerin "use strict"; eklediğini fark ettim "use strict"; javascript kodunuzda. İfadeyi eklediğim anda hata görünmüyordu. Maalesef, Google bu operatör hattının geçmişinin çoğunu açıklamadı. Tabii ki, bu tarayıcı tarafından JavaScript yorumlanması ile ilgili olmalı, ancak etkisinin ne olacağını bilmiyorum.

Öyleyse, "use strict"; bunun ne anlama geldiğiyle ilgili her şey var mı ve hala alakalı mı?

Mevcut herhangi bir tarayıcı "use strict"; yanıtını verir "use strict"; dize veya gelecekteki kullanım için mi?

6989
26 авг. Mark Rogers 26 Ağustos tarafından ayarlanır . 2009-08-26 19:10 '09, 19:10 2009-08-26 19:10
@ 30 cevap

Javascript Sıkı Modu hakkındaki bu makale ilginizi çekebilir: John Resig - ECMAScript 5 Sıkı Modu, JSON ve daha fazlası

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

Sıkı mod, ECMAScript 5'teki program veya işlevi "katı" bir çalışma 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 ayrıca:

Sıkı mod çeşitli şekillerde yardımcı olur:

  • İstisnaları dağıtan bazı kodlama kodlayıcıları yakalar.
  • Göreceli olarak "güvensiz" eylemler gerçekleştirildiğinde (örneğin, global bir nesneye erişim kazanma) hataları önler veya oluşturur.
  • Bu kafa karıştırıcı veya kötü düşünülmüş özellikleri devre dışı bırakır.

Ayrıca, tüm dosyaya "katı mod" uygulayabileceğinizi unutmayın ... Veya bunu yalnızca belirli bir işlev için kullanabilirsiniz (yine de John Resig'in makalesinden alıntı yaparak):

 // Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code... 

Eski ve yeni kodları karıştırmanız gerekirse, kullanışlı olabilir ;-)

Bu yüzden Perl'de kullanabileceğiniz "use strict" gibi bir şey olduğunu düşünüyorum (bu yüzden isim?): Arızaya yol açabilecek daha fazla şey bularak daha az hata yapmanıza yardımcı olur.

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

4587
26 авг. Cevap Pascal MARTIN 26 Ağustos tarafından verilmiştir . 2009-08-26 19:15 '09, 19:15 2009-08-26 19:15

Bu ECMAScript 5'in yeni bir özelliğidir. John Resig iyi bir özet yazdı.

Bu sadece JavaScript dosyalarınıza (dosyanızın en üstünde veya bir fonksiyonun içine) koyduğunuz bir satırdır;

border=0
 "use strict"; 

Bu kodu etkinleştirmek artık geçerli tarayıcılarda sorun yaratmamalı, çünkü bu sadece bir dizedir. Kodunuz bir pragmayı kırarsa, gelecekte kodunuzla ilgili sorunlara neden olabilir. Örneğin, eğer foo = "bar" varsa, önce foo = "bar" yapmazsanız, kodunuz çökecektir ... ki bence bu iyi.

1152
26 авг. Cevap seth 26 ağustosta verilir . 2009-08-26 19:14 '09 7:14, 2009-08-26 19:14

Deyimi "use strict"; Tarayıcıya, azaltılmış ve daha güvenli bir JavaScript işlevi kümesi olan Sıkı modunu kullanma talimatı verir.

İşlevlerin listesi (ayrıntılı değil)

  1. Global değişkenlere izin verilmez. (Değişken isimlerindeki eksik var bildirimlerini ve yazım hatalarını kaldırır)

  2. Sessiz başarısız görevler katı modda bir hataya neden olur ( NaN = 5; atama NaN = 5; )

  3. Hataya dayanıklı özellikleri kaldırma girişimleri neden olur ( delete Object.prototype )

  4. Değişmez nesne içindeki tüm özellik adlarının benzersiz olmasını gerektirir ( var x = {x1: "1", x1: "2"} )

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

  6. Yasaktır - sekizlik sözdizimi ( var x = 023; bazı geliştiriciler yanlışlıkla önceki sıfırın sayıyı değiştirecek bir şey yapmadığına inanmaktadır.)

  7. Anahtar kelimeyle yasaklama

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

  9. Basit ad silmeyi devre dışı bırak ( delete x; )

  10. Herhangi bir biçimde değerlendirme ve arguments bağlanmasını veya adlandırılmasını devre dışı bırakmak

  11. Sıkı mod, arguments nesnesinin özelliklerini biçimsel parametrelerle desteklemez. (yani, function sum (a,b) { return arguments[0] + b;} Bu çalışır çünkü arguments[0] a vb. ile ilişkilendirilir.)

  12. arguments.callee desteklenmiyor

[Link: Sıkı Modu , Mozilla Geliştirici Ağı]

567
25 нояб. Cevap 25 Kasım’da gprasant tarafından verildi. 2014-11-25 00:22 '14, 0:22 2014-11-25 00:22

İnsanlar use strict konusunda endişeli ise, bu makaleye göz atın:

ECMAScript 5 Tarayıcılarda Sıkı Modu desteği. Bu ne anlama geliyor?
NovoGeek.com - Krishna'nın Blogu

Tarayıcı desteği hakkında konuşuyor, ancak daha da önemlisi, nasıl kullanılacağı hakkında:

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 Cevap Jamie Hutber tarafından 16 Temmuz '12' de 02:25 de 02:25

Dikkatli bir şekilde, sert şarj ile programladığınız herhangi bir şey: mevcut koda "use strict" uygulamak tehlikeli olabilir! Bu şey "daha iyi" yapmak için koda basabileceğin hoş, mutlu bir etiket değil. Tarayıcı "use strict" "use strict" doğru "use strict" pragmalarını kullanırken, tarayıcı aniden hiç rastlamadığı rastgele yerlerde istisnalar atar, çünkü bu yerde JavaScript'in varsayılan / ücretsiz izin verdiği ancak katı JavaScript gibi değil ! Nadiren kullanılan aramalarda kodunuza gizlenmiş olan ve yalnızca sonuçta çalıştıkları zaman bir istisna oluşturacak katı ihlaller yaşayabilirsiniz - örneğin, ödeme müşterilerinizin kullandığı bir üretim ortamında!

Belirleyici bir adım atacaksanız, kapsamlı ünite testleri ve kesinlikle yapılandırılmış JSHint derleme görevi ile birlikte "use strict" öneririz; bu, sıkı modunu açtığınız için modülünüzün kötü bir şekilde patlayacağına dair karanlık bir köşe olmadığından emin olmanızı sağlar. Veya, hey, işte başka bir seçenek: sadece eski kodlarınızdan herhangi birine "use strict" eklemeyin, bu muhtemelen daha güvenli ve dürüst. KESİNLİKLE , üçüncü taraf modüller gibi, sahip olmadığınız veya desteklemediğiniz modüller için "use strict" KULLANMAYIN .

Bir kafeste ölümcül bir mide olsa bile, "use strict" iyi olabileceğini düşünüyorum, ama bunu doğru yapmak zorundasın. Kesinleşmenin en iyi zamanı, projeniz yeni olduğunda ve sıfırdan başladığınız zamandır. JSHint/JSLint kadar katlanmış tüm uyarılar ve seçeneklerle kurun, Grunt+Karma+Chai gibi yapılandırılabilen iyi bir yapı / test / onay sistemi edinin ve sadece THEN tüm yeni modüllerinizi işaretleyecektir. "use strict" . Birçok hata ve uyarıyı iyileştirmek için hazırlıklı olun. JSHint/JSLint herhangi bir düzensizliğe neden olursa, montajı HATA olarak ayarlayarak herkesin yerçekimini anladığından emin olun.

Benim projem "use strict" ı kabul ettiğimde yeni bir proje değildi. Sonuç olarak, IDE'm kırmızı işaretlerle dolu çünkü modüllerimin yarısında "use strict" ve JSHint bundan şikayet ediyor. Bu gelecekte ne yapmam gerektiğine dair bir hatırlatma. Amacım, tüm eksik "use strict" ifadelerimden dolayı ücretsiz kırmızı bir işaret olmaktır, ancak bu uzun yıllar olmuştur.

193
03 марта '14 в 10:37 2014-03-03 10:37 Cevap DWoldrich tarafından 03 '14 Mart tarihinde 10:37 tarihinde verilmiştir 2014-03-03 10:37

'use strict'; kullan 'use strict'; kodunuzu daha iyi yapmaz.

Sıkı JavaScript modu , ECMAScript 5'teki bir fonksiyondur. Senaryo / fonksiyonunun en üstünde bunu ilan ederek katı modu etkinleştirebilirsiniz.

 'use strict'; 

JavaScript motoru bu yönergeyi gördüğünde, kodu özel modda yorumlamaya başlayacaktır. Bu modda, potansiyel kodlar olabilecek bazı katı kodlama yöntemleri tespit edildiğinde hatalar meydana gelir (bu, katı mod lehine bir argümandır).

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

 var a = 365; var b = 030; 

Sayısal değişmezler oluşturma konusundaki saplantısında, geliştirici yanlışlıkla b değişkenini sekizinci değişmezle başlattı. Katı olmayan bir mod, bunu 24 değerinde (temel 10'da) sayısal bir değişmez olarak yorumlayacaktır. Ancak katı mod bir hataya neden olur.

Sıkı moddaki ayrıntılı olmayan özelliklerin listesi için, bkz. Bu cevap .


'use strict'; nerede 'use strict'; ?

  • Benim yeni javascript uygulamasında: Kesinlikle! Sıkı mod, kodunuzla aptalca bir şey yaptığınızda muhbir olarak kullanılabilir.

  • Var olan javascript kodumda: Muhtemelen hayır! Mevcut JavaScript kodunuz katı modda yasaklanmış talimatlar içeriyorsa, uygulama basitçe bozulur. Sıkı moda ihtiyacınız varsa, mevcut kodu ayıklamaya ve düzeltmeye hazır olmalısınız. Bu nedenle 'use strict'; kullanım 'use strict'; kodunuzu daha iyi yapmaz.


Sıkı mod nasıl kullanılır?

  1. 'use strict'; Komut dosyanızın en üstünde:

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

    Lütfen myscript.js içindeki her şeyin katı modda yorumlanacağını unutmayın.

  2. Veya 'use strict'; yapıştırın 'use strict'; Vücudunuzun üstündeki ifade:

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

    doSomething fonksiyonunun sözcüksel kapsamındaki her şey katı modda yorumlanacaktır. Sözcüğün sözcük alanı burada önemlidir. Daha iyi bir açıklama için bu cevaba bakınız.


Hangi şeyler kesinlikle yasaktır?

Kesinlikle yasak olan bazı şeyleri anlatan iyi bir makale buldum (bunun özel bir liste olmadığını unutmayın):

hacim

Tarihsel olarak, JavaScript işlevlerin nasıl ele alındığına dair karıştı. Bazen statik olarak ele geçirilmiş gibi görünüyorlar, ancak bazı işlevler onları dinamik bir bölge tarafından kaplanmış gibi davranmaya zorluyor. Bu kafa karıştırıcıdır, bu da programları okumayı ve anlamayı zorlaştırır. Yanlış anlama, hatalara neden olur. Bu aynı zamanda bir performans konusudur. Statik bir alan tanımı derleme zamanında değişken bağlanmaya izin verir, ancak dinamik bir alan için gereksinim, performansta önemli bir düşüşle ilişkili olan çalışma zamanına kadar bağlanmanın ertelenmesi gerektiği anlamına gelir.

Sıkı mod, tüm değişken bağlamaların statik olarak yürütülmesini gerektirir. Bu, daha önce dinamik bağlantı gerektiren işlevlerin kaldırılması veya değiştirilmesi gerektiği anlamına gelir. Özellikle, ile olan operatör hariçtir ve eval-fonksiyonlarının arayanın çevresine müdahale etme kabiliyeti sınırlıdır.

Sıkı kodun avantajlarından biri, YUI Kompresör gibi araçların işleme konması için daha iyi çalışabilmeleridir.

Zımni global değişkenler

JavaScript, global değişkenleri ifade eder. 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ı basitleştirir çünkü ana iş görevlerinden bazılarını ihmal edebilirler. Ancak bu daha büyük programları yönetmeyi zorlaştırır ve güvenilirliği önemli ölçüde azaltır. Bu nedenle, katı modda, örtük global değişkenler artık oluşturulmaz. Tüm değişkenlerinizi açıkça belirtmeniz gerekir.

Global sızıntılar

Bunun global bir nesneyle ilişkilendirilmesine neden olabilecek birkaç durum vardır. Örneğin, bir yapıcı işlevini çağırdığınızda önekle new vermeyi unuttuysanız, this yapıcı beklenmedik bir şekilde genel bir nesneyle ilişkilendirilir, bu nedenle yeni bir nesneyi başlatmak yerine, bunun yerine genel değişkenlerle sessizce tahrif olur. Bu durumlarda, katı mod bunun yerine undefined duruma bağlanır ve this da undefined bir istisna atmasına neden olur ve hatayı daha önce algılamasını sağlar.

Gürültülü hata

JavaScript her zaman salt okunur özelliklere sahipti, ancak onları Object.createProperty işlevi, Object.createProperty işlevi için açık olan Object.createProperty olana kadar kendiniz oluşturamazsınız. Salt okunur bir özelliğe bir değer atamaya çalıştıysanız, başarısız olur. Atama, mülkün değerini değiştirmez, ancak programınız, sanki öyleymiş gibi davranır. Bu, programların tutarsız bir durumda geçişine yol açabilecek bir bütünlük tehlikesidir. Katı modda, salt okunur özelliği değiştirmeye çalışmak bir istisnaya neden olur.

sekizli

8 bitlik sayıların gösterimi, kelime boyutu 3 katı olan makinelerde makine programlaması yapılırken son derece kullanışlıdır. CDC 6600 ana bilgisayar ile çalışırken, 60 bitlik bir kelime büyüklüğüne sahip, sekizli bir sayıya ihtiyacınız vardı. Sekizli okuyabilirseniz, kelimeye 20 basamak olarak bakabilirsiniz. Op kodunu iki hane temsil etmiş ve bir hane 8 kayıttan birini tanımlamıştır. Makine kodlarından yüksek seviyeli dillere yavaş geçiş sırasında, programlama dillerinde sekizli formlar sağlamak yararlı kabul edildi.

C'de, son derece talihsiz sekizlik düşüncesi seçildi: baştaki sıfır. Bu yüzden C 0100 64 değil, 100 değil, 08 ise 8 değil bir hatadır. Dahası, maalesef, bu anakronizm JavaScript'i de içeren sadece tüm dillere kopyalanmıştır. Bunun başka bir amacı yok. Bu nedenle, katı modda, sekizlik formlara artık izin verilmez.

Et cetera

Sahte dizi argümanları ES5'teki dizilere biraz daha benziyor. Sıkı modda, caller ve caller özelliklerini kaybeder. Bu, çok fazla gizli içerik bırakmadan, arguments güvenilmez koda geçirmenizi sağlar. Ek olarak, işlevlerin arguments özelliği dışlanır.

Sıkı modda, değişmez bir işlevdeki yinelenen anahtarlar sözdizimi hatası verir. Yapamaz işlevi aynı ada sahip iki parametreye sahiptir. Yapamaz işlevi, parametrelerinden biriyle aynı ada sahip bir değişkene sahiptir. delete işlevi kendi değişkenlerine sahiptir. Yapılandırılamayan bir özelliği delete çalışmak şimdi bir istisna atar. İlkel değerler örtük olarak sarılmaz.


Javascript'in gelecek 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 üretecektir. Ayrılmış kelimeler:

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


Daha fazla okuma

144
29 янв. Tarafından verilen cevap sampathsris 29 Oca 2016-01-29 14:35 '16, 14:35 2016-01-29 14:35

Tüm geliştiricilerin katı modu kullanmaya başlamasını şiddetle tavsiye ederim. Sıkı modun yasal olarak bize kodunuzda olduğunu bilmediğimiz hatalardan kurtulmamıza yardımcı olacağı konusunda yeterince tarayıcı var.

Anlaşılan, ilk aşamada daha önce hiç karşılaşmadığımız hatalar olacak. Tüm avantajlardan faydalanmak için, hepimizin yakalandığından emin olmak için sıkı moda geçtikten sonra uygun testler yapmamız gerekiyor. Kesinlikle, kodumuzda kesinlikle use strict ve hata olmadığına inanı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. Sadece betiğinize yapıştırın ve hızlı bir şekilde kodunuzdaki farkedilebilir sorunları ve hataları tarar.

128
05 июля '13 в 22:38 2013-07-05 22:38 Cevap 05.0313’te 10: 38’da Pank’a verilecek 2013-07-05 22:38

Diğer cevapları tamamlayan biraz daha doğru bir cevap sunmak istiyorum. En popüler cevabı düzenlemeyi umuyordum, ama yapamadım. Mümkün olduğunca eksiksiz ve eksiksiz yapmaya çalıştım.

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

ECMAScript 5'te girilen "use strict" yönergesi.

Direktifler ifadelere benzer, ancak farklıdır.

  • use strict anahtar sözcükler içermez: bir yönerge, özel bir dize değişmezinden (tek veya çift tırnak içinde) oluşan basit bir ifade ifadesidir. ECMAScript 5'i uygulamayan JavaScript motorları, ifadeyi yan etkileri olmayan basitçe görür. ECMAScript standartlarının gelecekteki sürümlerinin, use gerçek bir anahtar kelime olarak sunması beklenmektedir; Böylece, alıntılar eski hale gelecektir.
  • use strict , yalnızca bir komut dosyasının veya işlevin başında kullanılabilir, yani. başka herhangi bir (gerçek) ifadeden önce gelmelidir. Bu, bir fonksiyon komut dosyasındaki ilk komut olmamalıdır: dize değişmezlerinden oluşan diğer operatör ifadelerinden önce gelebilir (ve JavaScript uygulamaları uygulamaya özel yönergeler olarak görülebilir). İlk gerçek işleci izleyen yazı dizileri (bir komut dosyasında veya işlevde) basit ifadelerdir. Tercümanlar bunları yönerge olarak yorumlamamalıdır ve etkisizdir.

use strict , aşağıdaki kodun (bir komut dosyasında veya işlevde) katı bir kod olduğunu gösterir. Komut en yüksek düzeyde kod (işlevde olmayan kod), komut use strict yönergesi use strict içerdiğinde katı bir kod olarak kabul edilir. Bir fonksiyonun içeriği, fonksiyonun kendisi katı kodla tanımlandığında veya fonksiyon, use strict yönergesi içerdiğinde katı kod olarak kabul edilir. eval() yöntemine iletilen kod, eval() bir dize kodundan çağrıldığında veya use strict yönergesi içerdiğinde katı bir kod olarak kabul edilir.

ECMAScript 5 katı modu, ilgili dil hatalarını ortadan kaldıran ve daha sıkı hata kontrolü ve daha fazla güvenlik sağlayan JavaScript dilinin sınırlı bir alt kümesidir. Sıkı mod ve normal mod (ilk üçü özellikle önemlidir) arasındaki farklar şunlardır:

  • -Statement ile katı modda kullanamazsınız.
  • Sıkı modda tüm değişkenlerin bildirilmesi gerekir: değişken, işlev, işlev parametresi, catch-clause parametresi veya genel Object özelliği olarak tanımlanmayan bir tanımlayıcıya bir değer atarsanız, bir ReferenceError alırsınız. Normal modda, bir tanımlayıcı dolaylı olarak bir global değişken (global bir Object özelliği olarak) olarak bildirilir.
  • Sıkı modda, this , işlevler olarak adlandırılan ve yöntem olarak değil, undefined işlevlere sahiptir. (Normal modda, this her zaman global bir Object belirtir). Это различие можно использовать для проверки, поддерживает ли реализация строгий режим:
 var hasStrictMode = (function() { "use strict"; return this===undefined }()); 
  • Также, когда функция вызывается с call() или apply в строгом режиме, this точно значение первого аргумента call() или apply() . (В нормальном режиме null и undefined заменяются глобальным Object а значения, которые не являются объектами, преобразуются в объекты.)

  • В строгом режиме вы получите TypeError , когда вы пытаетесь назначить свойства readonly или определить новые свойства для не растяжимого объекта. (В обычном режиме оба просто обходятся без сообщения об ошибке.)

  • В строгом режиме при передаче кода в eval() вы не можете объявлять или определять переменные или функции в области вызывающего (как это можно сделать в обычном режиме). Вместо этого для eval() создается новая область, и переменные и функции находятся в пределах этой области. Эта область уничтожается после того, как eval() завершает выполнение.
  • В строгом режиме аргумент-объект функции содержит статическую копию значений, которые передаются этой функции. В нормальном режиме аргумент-объект имеет несколько "магическое" поведение: элементы массива и именованные функциональные параметры ссылаются на одно и то же значение.
  • В строгом режиме вы получите SyntaxError когда за оператором delete следует неквалифицированный идентификатор (переменная, функция или параметр функции). В нормальном режиме выражение delete ничего не сделает и будет оценено как false .
  • В строгом режиме вы получите TypeError при попытке удалить неконфигурируемое свойство. (В обычном режиме попытка просто терпит неудачу, а выражение delete - false ).
  • В строгом режиме это считается синтаксической ошибкой при попытке определить несколько свойств с тем же именем для литерала объекта. (В нормальном режиме ошибки нет.)
  • В строгом режиме это считается синтаксической ошибкой, когда объявление функции имеет несколько параметров с тем же именем. (В нормальном режиме ошибки нет.)
  • В строгом режиме не допускаются восьмеричные литералы (это литералы, начинающиеся с 0x . (В нормальном режиме некоторые реализации позволяют делать восьмеричные литералы).
  • В строгом режиме идентификаторы eval и arguments обрабатываются как ключевые слова. Вы не можете изменить их значение, не можете присвоить им значение, и вы не можете использовать их в качестве имен для переменных, функций, параметров функций или идентификаторов блока catch.
  • В строгом режиме больше ограничений на возможности проверки стека вызовов. arguments.caller и arguments.callee вызывают TypeError в функции в строгом режиме. Кроме того, некоторые свойства caller- и аргументы функций в строгом режиме вызывают TypeError при попытке их прочитать.
88
ответ дан Ely 15 мая '15 в 9:58 2015-05-15 09:58