JavaScript-də "ciddi istifadə" nədir və bunun səbəbləri nədir?

Bu yaxınlarda Crockford JSLint vasitəsi ilə mənim JavaScript kodunu işə saldım və aşağıdakı səhvləri verdi:

Xətt 1-də xarakterli problem 1: "istifadə edin ciddi" ifadəsi.

Bəzi axtarışlar apararkən, bəzi kəslərin "use strict"; olduğunu anladım "use strict"; javascript kodunuzda. İfadə əlavə edildikdən sonra səhv görünməyə başlamışdır. Təəssüf ki, Google bu operator xəttinin tarixinin əksəriyyətini açıqlamırdı. Əlbəttə ki, bu, brauzer tərəfindən JavaScript-nin şərh üsulu ilə bağlı olmalıdır, amma təsirin nə olacağını bilmirəm.

Belə ki, "use strict"; nədir "use strict"; bu nə deməkdir hər şeydir və hələ də müvafiqdir?

Hər hansı bir mövcud brauzer "use strict"; cavab verir "use strict"; simli və ya gələcək istifadəsi üçün mi?

6984
26 авг. Mark Rogers tərəfindən 26 avqust. 2009-08-26 19:10 '09 da 19:10 'da 2009-08-26 19:10
@ 30 cavab

Javascript Kobud rejimi ilə bağlı bu məqalə sizi maraqlandıra bilər: John Resig - ECMAScript 5 Qisa rejim, JSON və daha çox

Bəzi maraqlı hissələrdən sitat gətirmək üçün:

Sərt rejimi ECMAScript 5-də bir proqram və ya funksiyanı "ciddi" iş kontekstində yerləşdirməyə imkan verən yeni bir xüsusiyyətdir. Bu ciddi kontekst müəyyən tədbirlərin alınmasına mane olur və daha çox istisnalar atır.

Həmçinin:

Sərt rejim bir neçə yolla kömək edir:

  • İstisnalar atmaqla, bəzi ümumi kodlaşdırma blooplarını tutur.
  • Nisbətən "təhlükəli" hərəkətlər edildikdə (məsələn, qlobal bir obyektə giriş əldə edilərkən) səhvləri qarşısını alır və ya yaradır.
  • Bu, qarışıq və ya pis düşünülmüş xüsusiyyətləri aradan qaldırır.

Həm də bütün faylya "ciddi rejim" tətbiq edə biləcəyinizi qeyd edin ... Və ya onu yalnız müəyyən bir funksiyadan istifadə edə bilərsiniz (hələ də John Reçiqin məqaləsini istinadən):

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

Köhnə və yeni kod ;-) qarışdırmaq lazımdırsa faydalı ola bilər;

Beləliklə, Perl-də istifadə edə biləcəyiniz "use strict" səmərəli "use strict" kimi güman edirəm (bu səbəbdən də adı?): Bu qəzalara səbəb ola biləcək daha çox şey tapmaqla daha az səhv etməyə kömək edir.

Hal-hazırda, bütün əsas brauzerlər tərəfindən dəstəklənir (IE 9 panel və aşağıda).

4582
26 авг. Cavab Pascal MARTIN tərəfindən verilir 26 av. 2009-08-26 19:15 '09 da 19:15 'da 2009-08-26 19:15

ECMAScript 5-in yeni bir xüsusiyyəti. John Resig yaxşı bir xülasə yazdı.

Bu, JavaScript fayllarınıza (ya dosyanızın üstündə və ya bir funksiyanın içərisində) qoyduğunuz bir xəttdir və bu aşağıdakı kimi görünür:

border=0
 "use strict"; 

Bu kodun işə salınması, yalnız bir simli olduğu üçün artıq mövcud brauzerlər ilə problem yarada bilməz. Kodunuz bir pragmı pozarsa, gələcəkdə kodunuzla problem yarada bilər. Məsələn, əgər foo = "bar" ilk növbədə foo = "bar" deyilsə, foo = "bar" ... mənim fikrimcə yaxşıdır.

1151
26 авг. cavab cədvəl 26 avqustda verilir . 2009-08-26 19:14 '09 at 7:14 PM 2009-08-26 19:14

Bəyanat "use strict"; brauzerin sərt rejimdən istifadə etməsini öyrədir, bu JavaScript funksiyalarının daha az və daha təhlükəsiz bir dəstidir.

Fəaliyyətlərin siyahısı (qeyri-tamamlayıcı)

  1. Qlobal dəyişənlərə mane olur. (Değişken isimlerde eksik var bildirimleri ve hataları kaldırır)

  2. Silent başarısız tapşırıqlar ciddi rejimdə səhv olur ( NaN = 5; təyin NaN = 5; )

  3. delete Object.prototype qarşı tolerant xüsusiyyətləri aradan qaldırmağa cəhdlər səbəb olur ( delete Object.prototype )

  4. Nümunədəki obyektin bütün əmlak adları unikal olmalıdır ( var x = {x1: "1", x1: "2"} )

  5. Function parameter adları unikal olmalıdır ( function sum (x, x) {...} )

  6. Yasakları - sekizli sintaksis ( var x = 023; bəzi inkişafçılar səhvən əvvəlki sıfırın nömrəni dəyişdirmək üçün bir şey olmadığına inanırlar.)

  7. Açar sözlə qadağan

  8. Sıx rejimdə eval yeni dəyişənləri təqdim etmir

  9. Sadə ad silinməsi delete x; ( delete x; )

  10. Hər hansı formada evalarguments məcburi və ya adlandırılmasının eval

  11. Sərt rejim, formal parametrləri olan obyektlərin xüsusiyyətlərini dəstəkləmir. (yəni, function sum (a,b) { return arguments[0] + b;} Bu işləyir, çünki arguments[0] ilə əlaqəli və s.

  12. arguments.callee dəstəklənmir

[Bağlantı: Qatı rejimi , Mozilla Geliştirici Şəbəkəsi]

565
25 нояб. Cavab 25 noyabr. 2014-11-25 00:22 '14 'də 0:22 2014-11-25 00:22

İnsanlar use strict olduqları halda bu maddəni nəzərdən keçirmək mümkündür:

ECMAScript 5 Brauzerlərdə qətiyyətli rejim dəstəyi. Bu nə deməkdir?
NovoGeek.com - Krishnanın Blogu

Bu, brauzerinizin dəstəyi haqqında danışır, amma daha vacib olaraq, onu necə idarə edə bilərsiniz:

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 Cavab Jamie Hutber tərəfindən 16 iyul '12, saat 2:25 'də verildi 2012-07-16 02:25

Diqqətli bir sözlə, sərt şarj ilə proqramınız: tətbiq olunan "use strict" tətbiqi təhlükəli ola bilər! Bu şey, "daha yaxşı" etmək üçün kodu üstün tuta biləcəyiniz bir gözəl, xoşbəxt etiket deyil. "use strict" düzgün "use strict" pragmas "use strict" edərək, brauzer birdən əvvəl heç vaxt atılmayan təsadüfi yerlərdə istisnalar atır, sadəcə, çünki bu yerdə JavaScript-ni default / pulsuz üçün imkan verir, amma ciddi JavaScript kimi deyil !! Kodunuza nadir hallarda istifadə edilən zənglərdə gizli saxta pozuntulara yol aça bilərsən, istisna yaratdıqları zaman yalnız son nəticədə çalışırlar - məsələn, ödəmə müştərilərinizin istifadə etdiyi istehsal mühitində!

Qətiyyətli bir addım atmağı planlaşdırırsanız, hərtərəfli vahid testləri və ciddi konfiqurasiya edilən JSHint qurma tapşırıqları ilə yanaşı "use strict" etməli" olmanızı məsləhət görürük. Bu, ciddi moda döndüyünüz üçün pis bir şəkildə partlayacaq modulunuzun heç bir qaranlıq küncü olmadığına əmin ola bilərsiniz. Və ya, hey, başqa bir seçim var: yalnız köhnəlmiş kodlarınızdan hər hansı birinə "use strict" , bu daha təhlükəsiz, dürüst. Təəssüf ki, üçüncü tərəf modulları kimi özünüzə və ya dəstəyinizə malik olmayan hər hansı bir modul üçün "use strict" edin "use strict" .

Hesab edirəm ki, qəfəsdə ölümcül bir mədə olsa belə, "use strict" yaxşı ola bilər, amma bunu doğru etmək lazımdır. Sıxlıqla getmək üçün ən yaxşı vaxt, layihəniz yeni olduğunda və sıfırdan başlayır. JSHint/JSLint bütün JSHint/JSLint bütün xəbərdarlıqları və variantları ilə, Grunt+Karma+Chai kimi konfiqurasiya edilə biləcək yaxşı bir quruluş / test / təsdiq sistemi əldə edin və yalnız sonra bütün yeni modulları "use strict" . Çox səhvləri və xəbərdarlıqları müalicə etməyə hazır olun. JSHint/JSLint hər hansı bir usulsüzlük JSHint/JSLint hər kəs toplantıyı JSHint/JSLint yerçəkənliyi anladığından əmin olun.

Mən "use strict" qəbul etdiyim zaman layihəmiz yeni bir layihə olmadı. Nəticədə, IDE qırmızı işarələrlə doludur, çünki modullarımın yarısına "use strict" etmirəm "use strict" və JSHint bu barədə şikayət edir. Bu, mənə gələcəkdə nə etməyi planlaşdırdığımın bir xatırlatmasıdır. Mənim hədəfim bütün itkin "use strict" ifadələrindən dolayı pulsuz qırmızı bir qeyd olmaqdır, lakin bu, uzun illərdir.

193
03 марта '14 в 10:37 2014-03-03 10:37 Cavab DWoldrich tərəfindən 03.03.2014 tarixində 10:37 2014-03-03 10:37 tarixində verilir

'use strict'; edin 'use strict'; kodunuzu yaxşılaşdırmır.

Sərt JavaScript rejimi ECMAScript 5-də bir funksiyadır. Bunu, script / funksiyanızın yuxarısında elan edərək ciddi rejimi təmin edə bilərsiniz.

 'use strict'; 

JavaScript direktoru bu yönergeyi gördükdə kodu xüsusi rejimdə şərh etməyə başlayacaq. Bu rejimdə səhvlər potensial səhvlər ola bilər ki, müəyyən kodlaşdırma metodları aşkar edildikdə meydana gəlir (bu, ciddi rejimin lehinə bir arqumentdir).

Bu nümunəni nəzərdən keçirin:

 var a = 365; var b = 030; 

Sayısal ədədlər yaratmaq məqsədilə hazırladıqları qabaqcıl olaraq, geliştirici səhvən səkkizinci əlifba b dəyişən b başlanğıcını qoydu. Qeyri-ciddi bir rejimi 24 ədədi (bazasında 10) olan ədədi bir literal olaraq şərh edər. Lakin, ciddi rejim bir səhv gətirə bilər.

Qeyri-dəqiq ixtisaslar siyahısına ciddi rejimdə baxmaq üçün bu cavabı baxın.


Harada 'use strict'; istifadə etməli 'use strict'; etməliyəm 'use strict'; ?

  • Yeni javascript tətbiqimdə: Tamamilə! Kodunuzla axmaq bir şey etdiyiniz zaman qətiyyətli rejim informant kimi istifadə edilə bilər.

  • Mövcud javascript kodumda: Yəqin ki, yox! Mövcud JavaScript kodunuz ciddi rejimdə qadağan edilmiş təlimatlar içərsə, tətbiq sadəcə qırılacaq. Həddindən artıq rejimə ehtiyacınız varsa, kodunuzu düzəltməyə və mövcud kodu düzəltməyə hazır olmalısınız. Bu səbəbdən 'use strict'; kodunuzu yaxşılaşdırmır.


Qatı rejimi necə istifadə etmək olar?

  1. 'use strict'; daxil edin 'use strict'; ssenarinizin üstündə:

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

    myscript.js də hər şey ciddi rejimdə şərh ediləcəyini unutmayın.

  2. Ya da yapışdırıb 'use strict'; Vücudunuzun yuxarıdakı funksiyaları:

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

    doSomething funksiyasının leksik doSomething hər şey ciddi rejimdə şərh ediləcək. Sözün leksik sahəsi burada vacibdir. Daha yaxşı bir izahat üçün bu cavabı baxın.


Hansı şeylər qəti qadağandır?

Qətiliklə qadağan edilmiş bir neçə şeyi təsvir edən bir məqalə tapdım (bu xüsusi siyahı deyildir):

Həcmi

Tarixən, JavaScript funksiyaları necə əhatə olunduğuna dair qarışıqlıq yarandı. Bəzən onlar statik şəkildə tutulublar, amma bəzi funksiyalar bölgəni dinamik şəkildə əhatə etdiyi kimi davranmağa məcbur edirlər. Bu, oxu və anlaşma proqramlarını çətinləşdirən qarışıqdır. Yanlış anlama səhvlər yaradır. Bu da bir performans problemidir. Statik bir domen tərifi, kompilyasiya müddətində dəyişən məcburiyyətə icazə verəcək, lakin dinamik bir domen üçün tələbin yerinə yetirilməsinin performansın əhəmiyyətli dərəcədə azalması ilə əlaqəli olan müddətə qədər təxirə salınması deməkdir.

Sərt rejim bütün dəyişən bağlamaların statik olaraq yerinə yetirilməsini tələb edir. Daha əvvəl dinamik birləşmə tələb edən funksiyalar aradan qaldırılmalı və ya dəyişdirilməlidir. Xüsusilə, operatorla istisna edilir və qiymətləndirmə funksiyalarının zəng edənin mühitinə müdaxilə etmək qabiliyyəti məhduddur.

Yaddaş kodunun üstünlüklərindən biri YUI Compressor kimi alətlər onu işləyərkən daha yaxşı işləyə bilər.

Təqdim olunan qlobal dəyişənlər

JavaScript qlobal dəyişənləri nəzərdə tutur. Bir dəyişən açıqca bəyan etməsəniz, qlobal dəyişən sizin üçün örtülü olaraq elan edilir. Bu, yeni başlayanlar üçün proqramlaşdırma sadələşdirir, çünki əsas iş vəzifələrindən bəziləri laqeyd ola bilər. Lakin bu, daha böyük proqramları idarə etmək və etibarlılığı əhəmiyyətli dərəcədə azaldır. Beləliklə, ciddi rejimdə nəzərdə tutulan qlobal dəyişənlər artıq yaradılıb. Bütün dəyişənlərinizi açıq şəkildə elan etməlisiniz.

Qlobal sızmalar

Qlobal bir obyektlə əlaqəli bir sıra hallar mövcuddur. Məsələn, bir konstruktor funksiyasını çağırdığınız zaman prefiks new şey təmin etməyi unutduğunuzda, this qurucunun gözlənilmədən bir qlobal obyektlə əlaqəli olacağı üçün yeni bir obyektin başlanmasını əvəzinə səssizcə qlobal dəyişənlərlə saxtalaşdırmaq olacaq. Bu vəziyyətlərdə, qətiyyətli rejimi əvəzinə konstruktorun əvvəlki səhvləri aşkar etməyə imkan verən bir istisna atmasına səbəb olan, undefined .

Şiddətli səhv

JavaScript həmişə yalnız oxumaq xarakterli idi, lakin Object.createProperty funksiyası Object.createProperty funksiyası üçün açıq Object.createProperty qədər onları özünüz yarada Object.createProperty . Bir oxunuşlu əmlaka dəyər verməyə çalışdığınız zaman uğursuz olacaq. Tapşırıq əmlakın dəyərini dəyişdirməyəcəkdir, ancaq proqramınız sanki fəaliyyət göstərəcəkdir. Bu, bütövlüyün təhlükəsidir ki, bu da proqramların qeyri-sabit vəziyyətdə keçməsinə gətirib çıxara bilər. Sıx rejimdə, yalnız oxumaq əmlakını dəyişdirməyə cəhd istisna gətirəcəkdir.

sekizli

Sayıların 8-bit təsviri, sözü ölçüsü 3 ədəddən çox olan maşınlarda maşın proqramlaşdırma aparmaqda son dərəcə faydalı idi. CDC 6600 anaframe ilə işləyərkən, sözün ölçüsü 60 bitə bərabər, bir sekizli nömrəyə ehtiyacınız oldu. Səkkiz oxuya bilsəniz, sözü 20 rəqəm kimi nəzərdən keçirə bilərsiniz. İki rəqəm op kodunu əks etdirdi və bir rəqəmli 8 qeydiyyatdan birini təyin etdi. Makina kodlarından yüksək səviyyəli dillərə yavaş keçid dövründə, proqram dilində sekiz formaları təmin etmək faydalı olmuşdur.

C'de, octalitenin son dərəcə uğursuz ideyası seçildi: aparıcı sıfır. Beləliklə, C 0100 64 deyil, 100 deyil, 08 də səhv deyil, 8-dir. Təəssüf ki, bu anachronizm, yalnız səhvlər yaratmaq üçün istifadə olunan JavaScript, demək olar ki, bütün müasir dillərə kopyalandı. Bunun başqa bir məqsədi yoxdur. Beləliklə, ciddi rejimdə səkkiz formalara artıq icazə verilmir.

Et cetera

Pseudo array arguments ES5-də dizilərə bir az daha çox olur. callee rejimdə, bu calleecaller xüsusiyyətlərini itirir. Bu, çoxlu məxfi konteksti tərk etmədən, arguments etibarsız koda keçməyə imkan verir. Bundan əlavə, funksiyaların arguments mülkiyyətin xaricindədir.

Möhkəm rejimdə, funksiyanı literal olaraq dublikatların sintaksis səhvi verir. İşə yaramayan eyni funksiyalı iki parametrə malikdir. Funksiya funksiyası onun parametrlərindən biri ilə eyni adlı bir dəyişənə malikdir. Funksiyanın silinməməsi öz dəyişənlərinə malikdir. Yapılandırılmayan bir əmlakı delete cəhd indi istisna edir. Primitive dəyərlər örtük şəkildə bükülmür.


Javascriptin gələcək versiyaları üçün qorunur sözlər

ECMAScript 5, qorunan sözlər siyahısını əlavə edir. Onları dəyişənlər və ya arqumentlər kimi istifadə etsəniz, ciddi rejim səhv çıxaracaq. Qorunan sözlər:

package , private , protected , public , staticyield


Əlavə oxu

144
29 янв. sampathsris tərəfindən verilmiş cavab Jan 29 2016-01-29 14:35 '16 'da 14:35' də 2016-01-29 14:35 'da

Mən bütün developers ciddi rejimi istifadə etməyə başlamağını şiddətlə məsləhət görürəm. Qətiyyən qanuni şəkildə bizi kodunuzda bilmədiyimiz səhvlərdən qurtarmağa kömək edəcək ki, onu dəstəkləyən kifayət qədər brauzerlər var.

Göründüyü kimi, ilk mərhələdə biz heç vaxt qarşılaşmayan səhvlər olacaqdır. Tam fayda əldə etmək üçün, biz tutulmuş olduğumuza əmin olmaq üçün ciddi rejimə keçdikdən sonra düzgün test aparmalıyıq. Şübhəsiz ki, biz sadəcə use strict etmirik və heç bir səhvin olmadığına inanırıq. Belə ki, buraxma yaxşı kodu yazmaq üçün bu inanılmaz faydalı dil xüsusiyyətindən istifadə etməyə başlama vaxtıdır.

Məsələn,

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

JSLint , Douglas Crockford tərəfindən yazılmış bir ayıklama qurğusudur . Yalnız ssenarinizə yapışdırın və kodunuzda hər hansı nəzərəçarpan problemlər və səhvlər üçün tez bir zamanda tarar.

128
05 июля '13 в 22:38 2013-07-05 22:38 Cavab 05 İyul 2013 tarixində Pank'a 10:38 da veriləcək 2013-07-05 22:38

Digər cavabları tamamlayan bir qədər daha əsaslandırılmış cavab təklif etmək istərdim. Ən populyar cavabı redaktə etməyi ümid edirəm, amma edə bilmədi. Mən mümkün qədər tam və tam olaraq etməyə çalışdım.

Daha ətraflı məlumat üçün MDN sənədlərinə müraciət edə bilərsiniz.

ECMAScript 5-də daxil edilən "use strict" direktivi.

Direktivlər bəyanatlara bənzəyir, lakin fərqlidir.

  • use strict sözlər deyil: bir direktiv xüsusi bir simli literal (tək və ya cüt quotes) ibarət olan bir sadə ifadə ifadə edir. ECMAScript 5 tətbiq etməyən JavaScript mühərrikləri sadəcə yan təsir olmadan ifadə görür. ECMAScript standartlarının gələcək versiyalarından use etmək real bir söz kimi təqdim edilməlidir; Beləliklə, qiymətlər köhnəlir.
  • use strict yalnız bir skriptin və ya funksiyanın başında istifadə edilə bilər, yəni. hər hansı digər (real) ifadədən əvvəl olmalıdır. Bu, bir funksiya skriptində ilk təlimat olmamalıdır: əvvəlki simvollardan ibarət olan operator ifadələrindən istifadə edilə bilər (və JavaScript tətbiqləri tətbiqə aid direktivlər kimi baxıla bilər). İlk real operatoru (skript və ya funksiyasında) izləyən simli mətnlər sadə ifadələrdir. Interpreters onları direktivlər kimi şərh etməməli və heç bir təsiri yoxdur.

use strict qaydada use strict aşağıdakı kodun (script və ya funksiyasında) ciddi bir kod olduğunu göstərir. Ssenarinin ən yüksək səviyyədə kodu (funksiyada olmayan kod) skriptdə use strict sərəncamın use strict use strict etdikdə ciddi bir kod hesab edilir. Bir funksiyanın məzmunu funksiya özü sıx bir kodla müəyyən olunduqda və ya funksiyadan use strict edildikdə ciddi bir kod hesab olunur. eval() metoduna köçürülən kod, eval() string eval() və ya use strict direktivi içərisində ciddi bir kod sayılır.

ECMAScript 5 strict rejimi, müvafiq dil qüsurlarını aradan qaldırır və daha ciddi səhv yoxlanılması və təhlükəsizliyin artmasını təmin edən JavaScript dilinin məhdud bir alt kümesidir. Aşağıdakılar ciddi rejimi və normal rejimi (ilk üçü xüsusilə vacibdir) arasında fərqlərdir:

  • Qətiyyətsiz rejimdə istifadə edə bilməzsiniz.
  • Səviyyəli rejimdə, bütün dəyişənlər elan edilməlidir: dəyişən, funksiya, funksiya parametri, tutulma-bənd parametri və ya qlobal Object kimi elan edilməmiş bir identifikatora bir dəyər atarsanız, bir ReferenceError əldə edəcəksiniz. Normal rejimdə bir identifikator qlobal dəyişən kimi qlobal olaraq elan edilir (Qlobal bir obyektin mülkiyyəti kimi)
  • В строгом режиме ключевое слово this имеет значение undefined функции, которые были вызываться как функции ( а не как методы). (В нормальном режиме this всегда указывает на глобальный Object ). Это различие можно использовать для проверки, поддерживает ли реализация строгий режим:
 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

Мои два цента:

Одна из целей строгого режима - обеспечить более быструю отладку проблем. Это помогает разработчикам, бросая исключение, когда происходят некоторые неправильные вещи, которые могут вызвать тихое и странное поведение вашей веб-страницы. В тот момент, когда мы используем use strict , код выкидывает ошибки, которые помогают разработчику исправлять его заранее.

Немного важных вещей, которые я узнал после use strict :

Предотвращает глобальную декларацию переменных:

 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); 

Теперь этот код создает nameoftree в глобальной области видимости, доступ к которому можно получить с помощью window.nameoftree . Когда мы реализуем use strict использование кода, код будет вызывать ошибку.

Uncaught ReferenceError: nameoftree не определен

Sample

Исключает with утверждением:

with утверждениями не могут быть уменьшены с помощью таких инструментов, как uglify-js . Они также устарели и удалены из будущих версий JavaScript.

Sample

Предотвращает дублирование:

Когда у нас есть свойство duplicate, оно выдает исключение

Uncaught SyntaxError: Дублирование свойства данных в объектном литерале не допускается в строгом режиме

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

Есть еще несколько, но мне нужно больше узнать об этом.

77
ответ дан Shubh 21 окт. '14 в 16:31 2014-10-21 16:31

Если вы используете браузер, выпущенный в прошлом году или около того, он, скорее всего, поддерживает режим JavaScript Strict. Только старые браузеры до того, как ECMAScript 5 стал текущим стандартом, не поддерживают его.

Кавычки вокруг команды удостоверяются, что код по-прежнему будет работать и в старых браузерах (хотя вещи, которые генерируют синтаксическую ошибку в строгом режиме, как правило, просто приводят к тому, что скрипт будет работать некорректно в некоторых труднодоступных браузерах).

57
ответ дан Stephen 10 марта '12 в 6:31 2012-03-10 06:31

При добавлении "use strict"; , следующие случаи будут бросать SyntaxError перед выполнением скрипта:

  • Прокладывая путь к будущим версиям ECMAScript, используя одно из новых зарезервированных ключевых слов (в предвидении для ECMAScript 6): implements , interface , let , package , private , protected , public , static и yield .

  • Объявление функции в блоках

     if(a<b){ function f(){} } 
  • Восьмеричный синтаксис

     var n = 023; 
  • this точка относится к глобальному объекту.

      function f() { "use strict"; this.a = 1; }; f(); 
  • Объявление дважды того же имени для имени свойства в объектном литерале

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

    Это больше не относится к ECMAScript 6 ( ошибка 1041128 ).

  • Объявление двух аргументов функции с одинаковой функцией имени

     f(a, b, b){} 
  • Установка значения для необъявленной переменной

     function f(x){ "use strict"; var a = 12; b = a + x*35; // error! } f(); 
  • Использование delete для имени переменной delete myVariable;

  • Использование eval или arguments качестве имени arguments переменной или функции

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

Источники:

51
ответ дан zangw 23 дек. '15 в 6:10 2015-12-23 06:10

Строгий режим делает несколько изменений в обычной семантике JavaScript:

  • устраняет некоторые ошибки JavaScript без ошибок, изменяя их, чтобы выбросить ошибки.

  • исправляет ошибки, которые затрудняют выполнение JavaScript-движков.

  • запрещает некоторый синтаксис, который может быть определен в будущих версиях ECMAScript.

для получения дополнительной информации vistit Strict Mode- Javascript

50
ответ дан Renganathan MG 27 марта '14 в 15:18 2014-03-27 15:18

"Использовать строгий"; является страхованием, что программист не будет использовать свободные или плохие свойства JavaScript. Это руководство, точно так же, как правитель поможет вам сделать прямые линии. "Использовать Strict" поможет вам сделать "прямое кодирование".

Те, кто предпочитает не использовать правителей, чтобы делать свои строки подряд, обычно заканчиваются на тех страницах, которые требуют от других отладить свой код.

Поверь мне. Накладные расходы незначительны по сравнению с плохо разработанным кодом. У Доктора Крокфорда, который уже несколько лет является старшим разработчиком JavaScript, есть очень интересный пост . Лично мне нравится постоянно возвращаться на его сайт, чтобы я не забыл свою хорошую практику.

Современная практика JavaScript всегда должна вызывать "Use Strict"; Прагма. Единственная причина, по которой ECMA Group сделала вариант "Строгий", - это разрешить доступ менее опытным кодовым машинам к JavaScript и дать время для адаптации к новым и более безопасным способам кодирования.

48
ответ дан user2436758 31 мая '13 в 21:29 2013-05-31 21:29

Включение use strict в начале всех ваших файлов JavaScript с этого момента - это небольшой способ стать лучшим программистом JavaScript и избегать случайных переменных, становящихся глобальными, и ситуация меняется молча.

44
ответ дан Placeholder 05 сент. '14 в 15:53 2014-09-05 15:53

Цитирование из w3schools :

Директива об использовании строгих правил

Директива "use strict" появилась в JavaScript 1.8.5 (ECMAScript версии 5).

Это не утверждение, а буквальное выражение, игнорируемое более ранними версиями JavaScript.

Цель "использования строгого" - указать, что код должен выполняться в "строгом режиме".

В строгом режиме нельзя, например, использовать необъявленные переменные.

Почему строгий режим?

Строгий режим облегчает написание "безопасного" JavaScript.

Строгий режим изменяет ранее принятый "плохой синтаксис" на реальные ошибки.

Например, в обычном JavaScript неправильный ввод имени переменной создает новую глобальную переменную. В строгом режиме это приведет к ошибке, из-за которой невозможно случайно создать глобальную переменную.

В обычном JavaScript разработчик не будет получать никаких сообщений об ошибках, присваивая значения свойствам, недоступным для записи.

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

Пожалуйста, обратитесь к http://www.w3schools.com/js/js_strict.asp, чтобы узнать больше

36
ответ дан Mehul Singh 29 апр. '15 в 13:10 2015-04-29 13:10

"use strict" заставляет код JavaScript работать в строгом режиме, что в основном означает, что все должно быть определено перед использованием. Основная причина использования строгого режима состоит в том, чтобы избежать случайного глобального использования неопределенных методов.

Также в строгом режиме все работает быстрее, некоторые предупреждения или тихие предупреждения приводят к фатальным ошибкам, лучше всегда использовать его для создания более аккуратного кода.

"use strict" широко необходимо для использования в ECMA5, в ECMA6 это часть JavaScript по умолчанию , поэтому его не нужно добавлять, если вы используете ES6.

Посмотрите на эти заявления и примеры из MDN:

Директива об использовании строгих правил
Директива "use strict" появилась в JavaScript 1.8.5 (ECMAScript версии 5). Это не утверждение, а буквальное выражение, игнорируемое более ранними версиями JavaScript. Цель "использования строгого" - указать, что код должен выполняться в "строгом режиме". В строгом режиме нельзя, например, использовать необъявленные переменные.

Примеры использования "используйте строгий":
Строгий режим для функций: аналогично, чтобы вызвать строгий режим для функции, поместите точное выражение "use strict"; (или "используйте строгий";) в теле функции перед любыми другими утверждениями.

1) строгий режим в функциях

  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) строгий режим всего сценария

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

3) Присвоение неписываемым глобальным

 '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 

Вы можете прочитать больше на MDN .

32
ответ дан Alireza 22 мая '17 в 15:38 2017-05-22 15:38

Там были хорошие разговоры некоторых людей, которые были в комитете ECMAScript: " Изменения в JavaScript, часть 1: ECMAScript 5" о том, как инкрементное использование переключателя "use strict" позволяет разработчикам JavaScript очищать множество опасных функций JavaScript без внезапно разбивая каждый сайт в мире.

Конечно, в нем также говорится о том, что такое много ошибок (и), и как ECMAScript 5 их исправляет.

29
ответ дан FutureNerd 29 марта '14 в 3:47 2014-03-29 03:47

Обратите внимание, что use strict было введено в EcmaScript 5 и хранилось с тех пор.

Ниже приведены условия для запуска строгого режима в ES6 и ES7 :

  • Глобальный код - это строгий режимный код, если он начинается с директивного пролога, содержащего директиву Use Strict (см. 14.1.1).
  • Код модуля всегда является строгим кодом режима.
  • Все части ClassDeclaration или ClassExpression являются строгим кодом режима.
  • Eval code - это строгий режимный код, если он начинается с директивы Prologue, которая содержит директиву Use Strict или если вызов eval является прямой оценкой (см. 12.3.4.1), которая содержится в коде строгого режима.
  • Функциональный код - это строгий режимный код, если связанное с ним FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition или ArrowFunction содержится в коде строгого режима, или если код, который генерирует значение внутреннего слота функций [[ECMAScriptCode]], начинается с директивы Prologue который содержит ссылку на использование Strict.
  • Код функции, который поставляется в качестве аргументов встроенным конструкторам Function и Generator, является строгим кодом режима, если последним аргументом является String, который при обработке является FunctionBody, который начинается с директивы Prologue, которая содержит директиву Strict.
18
ответ дан Oriol 12 апр. '16 в 3:25 2016-04-12 03:25

Небольшие примеры для сравнения:

Нестрогий режим:

 'use strict'; for (i of [1,2,3]) console.log(i) // output: // Uncaught ReferenceError: i is not defined 

Нестрогий режим:

 String.prototype.test = function () { 'use strict'; console.log(typeof this === 'string'); }; 'a'.test(); // output // true 
16
ответ дан Foo 22 авг. '16 в 0:43 2016-08-22 00:43

Основными причинами, по которым разработчики должны использовать "use strict" являются:

  1. Предотвращает случайное объявление глобальных переменных. "use strict()" , убедитесь, что переменные объявлены с var перед использованием. Məsələn:

     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. NB: директива "use strict" распознается только в начале скрипта или функции.
  3. Строковые "arguments" не могут использоваться как переменная:

     "use strict"; var arguments = 3.14; // This will cause an error 
  4. Ограничит использование ключевых слов в качестве переменных. Попытки использовать их будут бросать ошибки.

Короче говоря, ваш код будет меньше подвержен ошибкам и, в свою очередь, заставит вас писать хороший код.

Чтобы узнать больше об этом, вы можете обратиться сюда .

11
ответ дан Pritam Banerjee 18 нояб. '16 в 12:53 2016-11-18 12:53

Использование Strict используется для отображения общих и повторяющихся ошибок, так что оно обрабатывается по-разному и изменяет способ запуска java-скрипта, такие изменения:

  • Предотвращает случайные глобальные переменные

  • Нет дубликатов

  • Исключает

  • Устраняет это принуждение

  • Более безопасный eval()

  • Ошибки для непременных

вы также можете прочитать эту статью за подробностями

10
ответ дан Wesam 17 окт. '16 в 16:59 2016-10-17 16:59

"использовать строгую"; это стремление ECMA сделать JavaScript немного более надежным. Это приносит JS попытку сделать его хотя бы немного "строгим" (другие языки применяют строгие правила с 90-х годов). Это на самом деле "заставляет" разработчиков JavaScript следовать некоторым передовым методам кодирования. Тем не менее, JavaScript очень хрупкий. Нет такой вещи, как типизированные переменные, типизированные методы и т.д. Я настоятельно рекомендую разработчикам JavaScript изучить более надежный язык, такой как Java или ActionScript3, и реализовать те же самые лучшие практики в вашем JavaScript-коде, он будет работать лучше и будет проще отлаживать.

10
ответ дан PippoApps.com 03 мая '16 в 15:59 2016-05-03 15:59

use strict - это способ сделать ваш код более безопасным, потому что вы не можете использовать опасные функции, которые могут работать не так, как вы ожидаете. И как было принято, прежде чем он сделает код более строгим.

10
ответ дан Просто программист 18 мая '16 в 1:31 2016-05-18 01:31

Обычно JavaScript не следует строгим правилам, что увеличивает вероятность ошибок. После использования "use strict" код JavaScript должен следовать строгому набору правил, как и в других языках программирования, таких как использование терминаторов, объявление перед инициализацией и т.д.

Если "use strict" , код должен быть написан в соответствии со строгим набором правил, что снижает вероятность ошибок и неясностей.

9
ответ дан Bikash Chapagain 20 нояб. '16 в 19:23 2016-11-20 19:23

JavaScript "строгий" режим вводится в ECMAScript 5.

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

написание "строгого использования"; на самом верху вашего JS файла включается строгая проверка синтаксиса. Для нас он выполняет следующие задачи:

(i) показывает ошибку, если вы пытаетесь назначить необъявленную переменную

(ii) останавливает вас от перезаписи ключевых системных библиотек JS

(ii) запрещает некоторые небезопасные или подверженные ошибкам языковые функции

"use strict" также работает внутри отдельных функций. Всегда лучше использовать "строгое использование в вашем коде".

Проблема совместимости с браузером: директивы "use" предназначены для обратной совместимости. Браузеры, которые не поддерживают их, будут видеть только строковый литерал, на который не ссылаются дальше. Итак, они пройдут через него и продолжат движение.

8
ответ дан Rabin Pantha 11 нояб. '16 в 8:40 2016-11-11 08:40

Просто хотел добавить еще несколько очков.

Причина использования строгого Mode--->

  • Строгий режим упрощает запись "безопасного" JavaScript.

  • Строгий режим изменяет ранее принятый "плохой синтаксис" на реальный
    ошибки.

  • Например, в обычном JavaScript, обманывая имя переменной
    создает новую глобальную переменную.

  • В строгом режиме это вызовет ошибку, из-за чего невозможно случайно создать глобальную переменную.

  • В строгом режиме любое присвоение непривилегированного свойства,
    свойство getter-only, несуществующее свойство, несуществующий
    переменная или несуществующий объект, выдает ошибку.

То, что будет вызывать ошибки в строгом режиме Использование переменной, не объявляя ее, не допускается:

 "use strict"; x = 3.14; // This will cause an error 

Объекты также являются переменными.

Использование объекта, не объявляя его, не допускается:

  "use strict"; x = {p1:10, p2:20}; // This will cause an error 

Удаление переменной (или объекта) запрещено.

  "use strict"; var x = 3.14; delete x; // This will cause an error 

По соображениям безопасности eval() не может создавать переменные в области, из которой он был вызван:

 "use strict"; eval ("var x = 2"); alert (x); // This will cause an error 

В вызовах функций, подобных f(), это значение является глобальным объектом. В строгом режиме он теперь не определен.

"use strict" распознается только в начале скрипта.

4
ответ дан Adds 20 февр. '17 в 22:58 2017-02-20 22:58

Строгий режим - это функция в JavaScript, которая была введена в ECMAScript 5. Она устраняет некоторые тихие ошибки JavaScript, изменяя их на ошибки. Строгий режим применяется ко всем сценариям или отдельным функциям. Это не относится к операторам блока, заключенным в фигурные скобки {}. Вы можете реализовать строгий режим, добавив "используйте строгий"; в начале сценария или функции.

Некоторые ситуации, которые выдают ошибку в строгом режиме:

  • Установка функции с одинаковыми именами параметров.
  • Создание объекта с такими же ключами.
  • Тихие провальные задания.
  • Удаление простых имен или необратимых свойств
  • Установка целого числа, начинающегося с нуля, переменной

Есть некоторые браузеры, которые имеют только частичную поддержку строгого режима или не поддерживают его вообще (например, Internet Explorer ниже версии 10). Строгий режим вызовет ошибки браузеров, которые не реализуют строгий режим.

0
ответ дан alejoko 02 февр. '19 в 17:21 2019-02-02 17:21

"использовать строгое"; Определяет, что код JavaScript должен выполняться в "строгом режиме".

  • Директива "Use strict" была впервые введена в ECMAScript версии 5.
  • Это не утверждение, а буквальное выражение, игнорируемое более ранними версиями JavaScript.
  • Цель "использования строгого" - указать, что код должен выполняться в "строгом режиме".
  • В строгом режиме нельзя, например, использовать необъявленные переменные.

Все современные браузеры поддерживают "строгое использование", кроме Internet Explorer 9 и ниже.

Недостаток

Если разработчик использовал библиотеку, которая была в строгом режиме, но разработчик привык работать в обычном режиме, они могли бы вызвать некоторые действия с библиотекой, которые не будут работать должным образом.

Хуже того, поскольку разработчик находится в обычном режиме, он не имеет преимуществ, связанных с дополнительными ошибками, поэтому ошибка может молча завершиться сбоем.

Кроме того, как указано выше, строгий режим не позволяет вам делать определенные вещи.

Люди обычно думают, что вы не должны использовать эти вещи в первую очередь, но некоторым разработчикам не нравится ограничение и они хотят использовать все возможности языка.

0
ответ дан ashish 28 янв. '19 в 13:42 2019-01-28 13:42

Строгий режим - это функция в JavaScript, которая была введена в ECMAScript 5. Она устраняет некоторые тихие ошибки JavaScript, изменяя их на ошибки. Строгий режим применяется ко всем сценариям или отдельным функциям. Это не относится к операторам блока, заключенным в фигурные скобки {}. Вы можете реализовать строгий режим, добавив "используйте строгий"; в начале сценария или функции.

Некоторые ситуации, которые выдают ошибку в строгом режиме:

  • Установка функции с одинаковыми именами параметров.
  • Создание объекта с одинаковыми ключами.
  • Тихие провальные задания.
  • Удаление простых имен или необратимых свойств
  • Установка целого числа, начинающегося с нуля, переменной

Что касается того, использовать его или нет, важно помнить следующее:

Согласно ссылке MDN ниже:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Strict_mode

Строгий режим в браузерах

Основные браузеры теперь реализуют строгий режим. Однако не стоит слепо зависеть от этого, поскольку все еще существует множество версий браузера, которые используются в дикой природе, которые имеют лишь частичную поддержку строгого режима или вообще не поддерживают его (например, Internet Explorer ниже версии 10!). Строгий режим меняет семантику. Использование этих изменений приведет к ошибкам и ошибкам в браузерах, которые не поддерживают строгий режим. Соблюдайте осторожность при использовании строгого режима и поддерживайте зависимость от строгого режима с помощью функциональных тестов, которые проверяют, реализованы ли соответствующие части строгого режима. Наконец, обязательно протестируйте свой код в браузерах, которые поддерживают строгий режим и не поддерживают его. Если вы тестируете только в браузерах, которые не поддерживают строгий режим, у вас, скорее всего, будут проблемы в браузерах, которые поддерживают, и наоборот.

0
ответ дан alejoko 28 янв. '19 в 23:40 2019-01-28 23:40

"use strict" - строгий режим javascript, введенный в ECMA5. Это необязательно. Режим javascript по умолчанию - режим sloopy. Строгий режим добавляет некоторые строгие правила в javascript, для exp.

  1. Объявление var обязательное после строгого использования.
  2. октальная декларация не допускается, т.е. мы не можем объявлять числа, начинающиеся с 0, например, 010 не разрешено, но разрешено 10.
-1
ответ дан Avinash Malhotra 08 июля '18 в 20:18 2018-07-08 20:18

Другие вопросы по меткам или Задайте вопрос