Apa yang dilakukan "gunakan ketat" dalam JavaScript, dan apa alasannya?

Saya baru-baru ini meluncurkan kode JavaScript saya melalui Crockford JSLint , dan itu memberikan kesalahan berikut:

Masalah pada baris 1 karakter 1: Tidak ada pernyataan "gunakan ketat".

Saat melakukan beberapa pencarian, saya menyadari bahwa beberapa orang menambahkan "use strict"; dalam kode javascript Anda. Segera setelah saya menambahkan ekspresi, kesalahan tidak lagi muncul. Sayangnya, Google tidak mengungkapkan sebagian besar sejarah saluran operator ini. Tentu saja, ini harus dikaitkan dengan cara JavaScript ditafsirkan oleh browser, tetapi saya tidak tahu apa efeknya.

Jadi, apa yang "use strict"; apakah semuanya tentang hal ini menyiratkan, dan apakah masih relevan?

Peramban apa pun saat ini merespons "use strict"; string atau apakah untuk digunakan di masa depan?

6989
26 авг. diatur oleh Mark Rogers 26 Agustus. 2009-08-26 19:10 '09 pada 19:10 2009-08-26 19:10
@ 30 jawaban

Artikel tentang Javascript Strict Mode ini mungkin menarik bagi Anda: John Resig - ECMAScript 5 Strict Mode, JSON, dan lainnya

Mengutip beberapa bagian menarik:

Mode ketat adalah fitur baru di ECMAScript 5 yang memungkinkan Anda menempatkan program atau fungsi dalam konteks kerja "ketat". Konteks ketat ini mencegah tindakan tertentu yang diambil dan melemparkan lebih banyak pengecualian.

Juga:

Mode ketat membantu dalam beberapa cara:

  • Dia menangkap beberapa kode kesalahan umum, melempar pengecualian.
  • Ini mencegah atau membuat kesalahan ketika tindakan yang relatif "tidak aman" diambil (misalnya, mendapatkan akses ke objek global).
  • Ini menonaktifkan fitur yang membingungkan atau dipikirkan dengan buruk.

Perhatikan juga bahwa Anda dapat menerapkan "mode ketat" ke seluruh file ... Atau Anda dapat menggunakannya hanya untuk fungsi tertentu (masih mengutip artikel John Resig):

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

Apa yang bisa berguna jika Anda perlu mencampur kode lama dan baru ;-)

Jadi saya kira itu agak seperti "use strict" yang dapat Anda gunakan di Perl (karena namanya?): Ini membantu Anda membuat lebih sedikit kesalahan dengan menemukan lebih banyak hal yang dapat menyebabkan kerusakan.

Saat ini, didukung oleh semua browser utama (IE 9 panel dan di bawah).

4587
26 авг. jawabannya diberikan oleh Pascal MARTIN 26 Agustus. 2009-08-26 19:15 '09 pada 19:15 2009-08-26 19:15

Ini adalah fitur baru dari ECMAScript 5. John Resig menulis ringkasan yang bagus .

Ini hanya baris yang Anda letakkan di file JavaScript Anda (baik di bagian atas file Anda, atau di dalam suatu fungsi), yang terlihat seperti ini:

border=0
 "use strict"; 

Mengaktifkan kode ini seharusnya tidak lagi menyebabkan masalah dengan browser saat ini, karena ini hanya string. Ini dapat menyebabkan masalah dengan kode Anda di masa mendatang jika kode Anda me>foo = "bar" tanpa terlebih dahulu mendefinisikan foo , kode Anda akan macet ... yang, menurut saya, bagus.

1152
26 авг. jawabannya diberikan seth 26 Agustus. 2009-08-26 19:14 '09 pada 19:14 2009-08-26 19:14

Pernyataan "use strict"; menginstruksikan browser untuk menggunakan mode Ketat, yang merupakan set fungsi JavaScript yang dikurangi dan lebih aman.

Daftar fungsi (tidak lengkap)

  1. Melarang variabel global. (Menghapus deklarasi dan kesalahan ketik var dalam nama variabel)

  2. Tugas yang gagal diam akan menyebabkan kesalahan dalam mode ketat (menugaskan NaN = 5; )

  3. Upaya untuk menghapus properti toleran-kesalahan akan menyebabkan ( delete Object.prototype )

  4. Membutuhkan semua nama properti dalam objek literal menjadi unik ( var x = {x1: "1", x1: "2"} )

  5. Nama parameter fungsi harus unik ( function sum (x, x) {...} )

  6. Larangan - sintaks oktal ( var x = 023; beberapa pengembang keliru percaya bahwa nol sebelumnya tidak melakukan apa pun untuk mengubah angka.)

  7. Melarang with kata kunci

  8. eval dalam mode ketat tidak memperkenalkan variabel baru

  9. Nonaktifkan penghapusan nama sederhana ( delete x; )

  10. Menonaktifkan ikatan atau penamaan eval dan arguments dalam bentuk apa pun

  11. Mode ketat tidak mendukung properti objek arguments dengan parameter formal. (mis. dalam function sum (a,b) { return arguments[0] + b;} Ini berfungsi karena arguments[0] dikaitkan dengan a , dll.)

  12. arguments.callee tidak didukung

[Tautan: Mode Ketat , Jaringan Pengembang Mozilla]

567
25 нояб. jawabannya diberikan oleh gprasant 25 Nov. 2014-11-25 00:22 '14 pada 0:22 2014-11-25 00:22

Jika orang khawatir tentang use strict , Anda dapat memeriksa artikel ini:

Dukungan ECMAScript 5 Mode Ketat di browser. Apa artinya ini?
NovoGeek.com - Blog Krishna

Ini berbicara tentang dukungan browser, tetapi yang lebih penting, bagaimana menanganinya:

 function isStrictMode(){ return !this; }  function isStrictMode(){ "use strict"; return !this; }  
385
16 июля '12 в 2:25 2012-07-16 02:25 Jawaban diberikan oleh Jamie Hutber 16 Juli '12 pada 2:25 2012-07-16 02:25

Peringatan, apa pun yang Anda program dengan pengisian daya keras: menerapkan "use strict" pada kode yang ada bisa berbahaya! Benda ini bukan semacam stiker yang bagus dan bahagia yang bisa Anda tepuk kode untuk membuatnya "lebih baik." Dengan pragma "use strict" correct "use strict" , browser tiba-tiba melempar pengecualian di tempat-tempat acak yang belum pernah dilontarkan sebelumnya, hanya karena di tempat ini Anda melakukan apa yang diperbolehkan JavaScript untuk default / gratis, tetapi tidak seperti JavaScript ketat ! Anda mungkin memiliki pe>

Jika Anda akan mengambil >"use strict" bersama dengan tes unit komprehensif dan tugas pembangunan JSHint yang dikonfigurasikan dengan ketat, yang akan memberi Anda keyakinan bahwa tidak ada sudut gelap modul Anda yang akan meledak dengan buruk karena Anda telah mengaktifkan mode ketat. Atau, hei, inilah opsi lain: jangan hanya "use strict" kode "use strict" untuk salah satu dari kode usang Anda, ini mungkin lebih aman, jujur. PASTI JANGAN menambahkan "use strict" untuk setiap modul yang tidak Anda miliki atau dukung, seperti modul pihak ketiga.

Saya pikir meskipun perutnya mematikan di dalam sangkar, "use strict" mungkin baik, tetapi Anda harus melakukannya dengan benar. Waktu terbaik untuk bersikap tegas adalah ketika proyek Anda baru dan Anda mulai dari awal. Siapkan JSHint/JSLint dengan semua peringatan dan opsi yang dilipat sekeras yang dapat dikalahkan tim Anda, dapatkan sistem build / test / persetujuan yang baik yang dapat dikonfigurasi seperti Grunt+Karma+Chai , dan hanya MAKA yang akan menandai semua modul baru Anda sebagai "use strict" . Bersiaplah untuk menyembuhkan banyak kesalahan dan peringatan. Pastikan semua orang memahami gravitasi dengan mengatur unit ke FAIL jika JSHint/JSLint menyebabkan penyimpangan.

Proyek saya bukan proyek baru ketika saya mengadopsi "use strict" . Akibatnya, IDE saya penuh dengan tanda merah, karena saya tidak memiliki "use strict" pada setengah dari modul saya, dan JSHint mengeluh tentang hal itu. Ini adalah pengingat bagi saya tentang apa yang harus saya lakukan di masa depan. Tujuan saya adalah menjadi tanda merah secara gratis karena semua pernyataan "use strict" saya yang hi>

193
03 марта '14 в 10:37 2014-03-03 10:37 Jawaban diberikan oleh DWoldrich pada 03 Maret '14 di 10:37 2014-03-03 10:37

Gunakan 'use strict'; tidak membuat kode Anda lebih baik.

Mode JavaScript ketat adalah fungsi di ECMAScript 5 . Anda dapat mengaktifkan mode ketat dengan menyatakan ini di bagian atas skrip / fungsi Anda.

 'use strict'; 

Ketika mesin JavaScript melihat arahan ini, itu akan mulai menafsirkan kode dalam mode khusus. Dalam mode ini, kesalahan terjadi ketika metode pengkodean tertentu terdeteksi yang mungkin merupakan kesalahan potensial (yang merupakan argumen yang mendukung mode ketat).

Pertimbangkan contoh ini:

 var a = 365; var b = 030; 

Dalam obsesinya untuk membangun literal angka, pengembang secara tidak sengaja menginisialisasi variabel b literal kedelapan. Mode non-ketat akan menafsirkan ini sebagai numerik literal dengan nilai 24 (dalam basis 10). Namun, mode ketat akan menyebabkan kesalahan.

Untuk daftar spesialisasi yang tidak lengkap dalam mode ketat, lihat Jawaban ini .


Di mana saya harus menggunakan 'use strict'; ?

  • Di aplikasi javascript baru saya: Benar-benar! Mode ketat dapat digunakan sebagai informan ketika Anda melakukan sesuatu yang bodoh dengan kode Anda.

  • Dalam kode javascript saya yang ada: Mungkin tidak! Jika kode JavaScript Anda yang ada berisi instruksi yang dilarang dalam mode ketat, aplikasi hanya akan rusak. Jika Anda memerlukan mode ketat, Anda harus siap untuk debug dan memperbaiki kode yang ada. Itu sebabnya penggunaan 'use strict'; tidak membuat kode Anda lebih baik.


Bagaimana cara menggunakan mode ketat?

  1. Masukkan 'use strict'; di bagian atas skrip Anda:

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

    Harap dicatat bahwa semua yang ada di myscript.js akan ditafsirkan dalam mode ketat.

  2. Atau tempel 'use strict'; Pernyataan di atas fungsi tubuh Anda:

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

    Segala sesuatu dalam lingkup leksikal dari fungsi doSomething akan ditafsirkan dalam mode ketat. Area leksikal dari kata itu penting di sini. Lihat jawaban ini untuk penjelasan yang lebih baik.


Hal-hal apa yang dilarang keras?

Saya menemukan artikel bagus yang menggambarkan beberapa hal yang dilarang keras (perhatikan bahwa ini bukan daftar eksklusif):

Volume

Secara historis, JavaScript telah bingung tentang bagaimana fungsi dibahas. Kadang-kadang mereka tampaknya ditangkap secara statis, tetapi beberapa fungsi memaksa mereka untuk berperilaku seolah-olah mereka secara dinamis dilindungi oleh suatu wilayah. Ini membingungkan, yang membuat program membaca dan memahami sulit. Kesalahpahaman menyebabkan kesalahan. Ini juga masalah kinerja. Definisi domain statis akan memungkinkan pengikatan variabel pada waktu kompilasi, tetapi persyaratan untuk domain dinamis berarti bahwa pengikatan harus ditangguhkan hingga runtime, yang terkait dengan penurunan kinerja yang signifikan.

Mode ketat mengharuskan semua binding variabel dijalankan secara statis. Ini berarti bahwa fungsi yang sebelumnya memerlukan tautan dinamis harus dihi>

Salah satu kelebihan dari kode ketat adalah alat seperti Kompresor YUI dapat bekerja lebih baik dalam memprosesnya.

Variabel global tersirat

JavaScript menyiratkan variabel global. Jika Anda tidak secara eksplisit mendeklarasikan suatu variabel, variabel global secara implisit dideklarasikan untuk Anda. Ini menyederhanakan pemrograman untuk pemula, karena mereka mungkin mengabaikan beberapa tugas bisnis utama mereka. Tetapi ini membuatnya sulit untuk mengelola program yang lebih besar dan secara signifikan mengurangi keandalan. Dengan demikian, dalam mode ketat, variabel global tersirat tidak lagi dibuat. Anda harus secara eksplisit mendeklarasikan semua variabel Anda.

Kebocoran global

Ada sejumlah situasi yang dapat menyebabkan this dikaitkan dengan objek global. Misalnya, jika Anda lupa memberikan awalan baru saat Anda memanggil fungsi konstruktor, konstruktor this akan dikaitkan secara tak terduga dengan objek global, jadi alih-alih menginisialisasi objek baru, sebaliknya, ia akan secara diam-diam memalsukan variabel global. Dalam situasi ini, mode ketat malah mengikat this dengan undefined , yang menyebabkan konstruktor untuk melemparkan pengecualian, yang memungkinkannya untuk mendeteksi kesalahan lebih awal.

Kesalahan berisik

JavaScript selalu memiliki properti hanya-baca, tetapi Anda tidak dapat membuatnya sendiri hingga fungsi Object.createProperty adalah Object.createProperty terbuka untuk fungsi Object.createProperty . Jika Anda mencoba menetapkan nilai ke properti hanya-baca, itu akan gagal. Penugasan tidak akan mengubah nilai properti, tetapi program Anda akan bertindak seolah-olah demikian. Ini adalah bahaya integritas, yang dapat menyebabkan transisi program dalam keadaan yang tidak konsisten. Dalam mode ketat, mencoba mengubah properti read-only akan menyebabkan pengecualian.

oktal

Representasi angka 8-bit sangat berguna ketika melakukan pemrograman mesin pada mesin yang ukuran kata-nya adalah kelipatan 3. Ketika bekerja dengan mainframe CDC 6600, dengan ukuran kata 60 bit, Anda memerlukan angka oktal. Jika Anda bisa membaca oktal, Anda bisa melihat kata itu sebagai 20 digit. Dua digit mewakili kode op, dan satu digit mengidentifikasi satu dari 8 register. Selama transisi lambat dari kode mesin ke bahasa tingkat tinggi, dianggap berguna untuk menyediakan bentuk oktal dalam bahasa pemrograman.

Di C, ide oktalitas yang sangat disayangkan dipilih: nol di depan. Jadi di C 0100 berarti 64, bukan 100, dan 08 adalah kesalahan, bukan 8. Bahkan, sayangnya, anakronisme ini disalin ke hampir semua bahasa modern, termasuk JavaScript, di mana ia digunakan hanya untuk membuat kesalahan. Ini tidak memiliki tujuan lain. Jadi, dalam mode ketat, bentuk oktal tidak lagi diizinkan.

Dll

Argumen pseudo array menjadi sedikit lebih mirip array di ES5. Dalam mode ketat, ia kehi>callee dan caller . Ini memungkinkan Anda meneruskan arguments Anda arguments kode yang tidak arguments diandalkan, tanpa meninggalkan banyak konteks rahasia. Selain itu, properti arguments fungsi dikecualikan.

Dalam mode ketat, duplikat kunci dalam fungsi literal memberikan kesalahan sintaksis. Fungsi tidak dapat memiliki dua parameter dengan nama yang sama. Fungsi tidak dapat memiliki variabel dengan nama yang sama dengan salah satu parameternya. Fungsi tidak dapat delete memiliki variabel sendiri. Mencoba untuk delete tidak dapat dikonfigurasi sekarang mengeluarkan pengecualian. Nilai-nilai primitif tidak dibungkus secara implisit.


Kata-kata yang dicadangkan untuk versi javascript selanjutnya

ECMAScript 5 menambahkan daftar kata-kata yang dipesan. Jika Anda menggunakannya sebagai variabel atau argumen, mode ketat akan menghasilkan kesalahan. Kata-kata yang dicadangkan:

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


Bacaan lebih lanjut

144
29 янв. jawaban yang diberikan oleh sampathsris 29 Jan 2016-01-29 14:35 '16 pada 14:35 2016-01-29 14:35

Saya sangat menyarankan agar semua pengembang mulai menggunakan mode ketat. Ada cukup banyak browser yang mendukungnya sehingga mode ketat secara hukum akan membantu menyelamatkan kami dari kesalahan yang bahkan tidak kami ketahui ada dalam kode Anda.

Ternyata, pada tahap awal akan ada kesalahan yang belum pernah kita temui sebelumnya. Untuk mendapatkan manfaat penuh, kita perlu melakukan pengujian yang tepat setelah beralih ke mode ketat untuk memastikan bahwa kita semua tertangkap. Jelas, kami hanya tidak use strict dalam kode kami dan percaya bahwa tidak ada kesalahan. Jadi churnnya adalah saatnya untuk mulai menggunakan fitur bahasa yang sangat berguna ini untuk menulis kode yang lebih baik.

Sebagai contoh

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

JSLint adalah debugger yang ditulis oleh Douglas Crockford. Cukup rekatkan ke skrip Anda, dan dengan cepat memindai segala masalah dan kesalahan yang terlihat dalam kode Anda.

128
05 июля '13 в 22:38 2013-07-05 22:38 jawabannya diberikan kepada Pank pada 05 Juli '13 pada 10:38 2013-07-05 22:38

Saya ingin menawarkan jawaban yang sedikit lebih kuat yang melengkapi jawaban lainnya. Saya berharap untuk mengedit jawaban yang paling populer, tetapi saya tidak bisa. Saya mencoba membuatnya selengkap dan selengkap mungkin.

Untuk informasi lebih lanjut, Anda dapat merujuk ke dokumentasi MDN .

Arahan "use strict" dimasukkan dalam ECMAScript 5.

Arahan seperti pernyataan, tetapi berbeda.

  • use strict tidak mengandung kata kunci: arahan adalah pernyataan ekspresi sederhana yang terdiri dari string literal khusus (dalam tanda kutip tunggal atau ganda). Mesin JavaScript yang tidak menerapkan ECMAScript 5 cukup melihat ekspresi tanpa efek samping. Versi mendatang dari standar ECMAScript diharapkan untuk memperkenalkan use sebagai kata kunci nyata; Dengan demikian, kutipan akan menjadi usang.
  • use strict hanya dapat digunakan di awal skrip atau fungsi, yaitu harus mendahului pernyataan (nyata) lainnya. Ini tidak boleh menjadi instruksi pertama dalam skrip fungsi: itu bisa didahului oleh ekspresi operator lain yang terdiri dari string literal (dan implementasi JavaScript dapat dilihat sebagai arahan khusus untuk implementasi). Literal string yang mengikuti operator nyata pertama (dalam skrip atau fungsi) adalah ekspresi sederhana. Penerjemah tidak boleh menafsirkannya sebagai arahan, dan mereka tidak memiliki efek.

use strict menunjukkan bahwa kode berikut (dalam skrip atau fungsi) adalah kode ketat. Kode pada level tertinggi dari skrip (kode yang tidak ada dalam fungsi) dianggap sebagai kode yang ketat ketika skrip berisi use strict use strict petunjuk use strict . Konten suatu fungsi dianggap sebagai kode ketat ketika fungsi itu sendiri didefinisikan dalam kode ketat atau ketika fungsi tersebut berisi use strict arahan use strict . Kode yang diteruskan ke metode eval() dianggap sebagai kode ketat ketika eval() dipanggil dari kode string atau berisi use strict directive directive.

Mode ketat ECMAScript 5 adalah subset terbatas dari bahasa JavaScript, yang menghi>

  • Anda tidak dapat menggunakannya with pernyataan dalam mode ketat.
  • Dalam mode ketat, semua variabel harus dideklarasikan: jika Anda menetapkan nilai ke pengenal yang belum dinyatakan sebagai variabel, fungsi, parameter fungsi, parameter klausa catch, atau properti Object global, maka Anda akan mendapatkan ReferenceError . В нормальном режиме идентификатор объявляется неявно как глобальная переменная (как свойство глобального Object )
  • В строгом режиме ключевое слово 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