Pertanyaan Apa yang "ketat digunakan" di JavaScript, dan apa alasannya?


Baru-baru ini, saya menjalankan beberapa kode JavaScript saya melalui Crockford's JSLint, dan itu memberi kesalahan berikut:

Masalah pada baris 1 karakter 1: Pernyataan "penggunaan ketat" tidak ada.

Melakukan pencarian, saya menyadari bahwa beberapa orang menambahkan "use strict"; ke dalam kode JavaScript mereka. Setelah saya menambahkan pernyataan, kesalahan berhenti muncul. Sayangnya, Google tidak mengungkapkan banyak sejarah di balik pernyataan string ini. Tentunya harus ada hubungannya dengan bagaimana JavaScript diinterpretasikan oleh browser, tetapi saya tidak tahu apa efeknya.

Jadi apa itu? "use strict"; semua tentang, apa artinya, dan apakah itu masih relevan?

Lakukan salah satu dari browser saat ini menanggapi "use strict"; string atau apakah itu untuk digunakan di masa depan?


6702
2017-08-26 16:10


asal


Jawaban:


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

Untuk mengutip beberapa bagian yang menarik:

Mode Ketat adalah fitur baru di ECMAScript 5 yang memungkinkan Anda menempatkan program, atau fungsi, dalam konteks operasi "ketat". Konteks yang ketat ini mencegah tindakan tertentu agar tidak diambil dan menyebabkan lebih banyak pengecualian.

Dan:

Mode ketat membantu dalam beberapa cara:

  • Ini menangkap beberapa bloopers coding umum, melempar pengecualian.
  • Ini mencegah, atau melempar kesalahan, ketika tindakan yang relatif "tidak aman" diambil (seperti mendapatkan akses ke objek global).
  • Ini menonaktifkan fitur yang membingungkan atau kurang dipikirkan.

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

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

Yang mungkin berguna jika Anda harus mencampur kode lama dan baru ;-)

Jadi, saya kira itu agak seperti "use strict" Anda dapat menggunakan dalam Perl (maka nama?): ini membantu Anda membuat lebih sedikit kesalahan, dengan mendeteksi lebih banyak hal yang dapat menyebabkan kerusakan.

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


4392
2017-08-26 16:15



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

Ini hanya string yang Anda masukkan ke dalam file JavaScript Anda (baik di bagian atas file Anda atau di dalam fungsi) yang terlihat seperti ini:

"use strict";

Menempatkannya di kode Anda sekarang seharusnya tidak menyebabkan masalah dengan browser saat ini karena itu hanya string. Ini dapat menyebabkan masalah dengan kode Anda di masa depan jika kode Anda melanggar pragma. Misalnya, jika Anda saat ini foo = "bar" tanpa menentukan foo pertama, kode Anda akan mulai gagal ... yang merupakan hal yang baik menurut saya.


1101
2017-08-26 16:14



Pernyataan "use strict"; menginstruksikan browser untuk menggunakan mode Strict, yang merupakan kumpulan fitur JavaScript yang dikurangi dan lebih aman.

Daftar fitur (tidak lengkap)

  1. Tidak mengizinkan variabel global. (Tangkapan hilang var deklarasi dan kesalahan ketik dalam nama-nama variabel)

  2. Penetapan gagal diam akan menimbulkan kesalahan dalam mode ketat (menugaskan NaN = 5;)

  3. Upaya untuk menghapus sifat yang tidak dapat dihapus akan membuang (delete Object.prototype)

  4. Mewajibkan 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. Melarang sintaks oktal (var x = 023; beberapa devs menganggap salah bahwa nol sebelumnya tidak mengubah angka.)

  7. Melarang with kata kunci

  8. eval dalam mode ketat tidak memperkenalkan variabel baru

  9. Melarang menghapus nama polos (delete x;)

  10. Melarang pengikatan atau penugasan nama eval dan arguments dalam bentuk apapun

  11. Mode ketat tidak sifat alias dari arguments objek dengan parameter formal. (yaitu di function sum (a,b) { return arguments[0] + b;} Ini berfungsi karena arguments[0] pasti a dan seterusnya. )

  12. arguments.callee tidak didukung

[Ref: Mode ketat, Jaringan Pengembang Mozilla]


518
2017-11-24 21:22



Jika orang khawatir tentang menggunakan use strict mungkin layak untuk membaca artikel ini:

Dukungan ECMAScript 5 'Strict mode' di browser. Apa artinya ini?
NovoGeek.com - weblog Krishna

Ini berbicara tentang dukungan browser, tetapi yang lebih penting bagaimana mengatasinya dengan aman:

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

368
2017-07-15 23:25



Sebuah kata peringatan, semua programmer yang susah payah: melamar "use strict" kode yang ada dapat berbahaya! Benda ini bukan stiker perasaan bahagia yang bisa Anda tepukan pada kode untuk membuatnya 'lebih baik'. Dengan "use strict" pragma, peramban akan tiba-tiba mencampakkan pengecualian di tempat-tempat acak yang tidak pernah dilemparkan sebelumnya hanya karena di tempat itu Anda melakukan sesuatu yang default / longgar JavaScript dengan senang hati memungkinkan tetapi JavaScript ablaim yang ketat! Anda mungkin memiliki pelanggaran ketat yang disembunyikan di panggilan yang jarang digunakan dalam kode Anda yang hanya akan membuang pengecualian ketika mereka akhirnya dijalankan - katakanlah, dalam lingkungan produksi yang digunakan pelanggan berbayar Anda!

Jika Anda akan mengambil risiko, itu adalah ide yang baik untuk diterapkan "use strict" bersama dengan tes unit komprehensif dan tugas membangun JSHint yang dikonfigurasikan secara ketat yang akan memberi Anda keyakinan bahwa tidak ada sudut gelap dari modul Anda yang akan meledak dengan mengerikan hanya karena Anda telah mengaktifkan Mode Ketat. Atau, hei, inilah opsi lain: jangan tambahkan "use strict" ke kode warisan Anda, mungkin lebih aman dengan cara itu, jujur. PASTI JANGAN menambahkan "use strict" ke modul apa pun yang tidak Anda miliki atau pertahankan, seperti modul pihak ketiga.

Saya pikir meskipun itu adalah hewan yang dikandangkan mematikan, "use strict" bisa menjadi barang bagus, tetapi Anda harus melakukannya dengan benar. Waktu terbaik untuk pergi ketat adalah ketika proyek Anda adalah greenfield dan Anda mulai dari awal. Konfigurasikan JSHint/JSLint dengan semua peringatan dan opsi yang dihidupkan seketat tim Anda dapat perut, dapatkan build / test / assert system du jour yang bagus seperti Grunt+Karma+Chai, dan hanya KEMUDIAN mulai menandai semua modul baru Anda sebagai "use strict". Bersiaplah untuk menyembuhkan banyak kesalahan dan peringatan niggly. Pastikan semua orang memahami gravitasi dengan mengkonfigurasi build ke GAGAL jika JSHint/JSLintmenghasilkan pelanggaran apa pun.

Proyek saya bukanlah proyek greenfield ketika saya mengadopsi "use strict". Akibatnya, IDE saya penuh dengan tanda merah karena saya tidak punya "use strict" pada setengah modul saya, dan JSHint mengeluh tentang itu. Ini adalah pengingat bagi saya tentang refactoring apa yang harus saya lakukan di masa depan. Tujuan saya adalah menjadi tanda merah gratis karena semua yang hilang "use strict" pernyataan, tetapi itu tahun lagi sekarang.


182
2018-03-03 07:37



Menggunakan 'use strict'; tidak tiba-tiba membuat kode Anda lebih baik.

Itu Modus ketat JavaScript adalah fitur di ECMAScript 5. Anda dapat mengaktifkan mode ketat dengan mendeklarasikan ini di bagian atas skrip / fungsi Anda.

'use strict';

Ketika mesin JavaScript melihat ini direktif, itu akan mulai menafsirkan kode dalam mode khusus. Dalam mode ini, kesalahan yang dilemparkan ketika praktek pengkodean tertentu yang bisa berakhir menjadi bug potensial terdeteksi (yang merupakan alasan di balik mode ketat).

Pertimbangkan contoh ini:

var a = 365;
var b = 030;

Dalam obsesi mereka untuk menyusun literal numerik, pengembang secara tidak sengaja menginisialisasi variabel b dengan literal oktal. Mode non-strict akan menafsirkan ini sebagai literal numerik dengan nilai 24 (dalam basis 10). Namun, mode ketat akan menimbulkan kesalahan.

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


Di mana saya harus menggunakan 'use strict';?

  • Di dalam saya baru Aplikasi JavaScript: Benar! Mode ketat dapat digunakan sebagai whistleblower saat Anda melakukan sesuatu yang bodoh dengan kode Anda.

  • Di dalam saya ada Kode JavaScript: Mungkin tidak! Jika kode JavaScript Anda yang ada memiliki pernyataan yang dilarang dalam mode ketat, aplikasi akan putus. Jika Anda ingin mode ketat, Anda harus siap untuk melakukan debug dan memperbaiki kode yang ada. Ini sebabnya menggunakan 'use strict'; tidak tiba-tiba membuat kode Anda lebih baik.


Bagaimana saya menggunakan mode ketat?

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

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

    Perhatikan bahwa semua yang ada di file myscript.js akan ditafsirkan dalam mode ketat.

  2. Atau, masukkan a 'use strict'; pernyataan di atas tubuh fungsi Anda:

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

    Segala sesuatu di ruang lingkup leksikal fungsi doSomething akan ditafsirkan dalam mode ketat. Kata ruang lingkup leksikal penting di sini. Lihat jawaban ini untuk penjelasan yang lebih baik.


Apa yang dilarang dalam mode ketat?

saya menemukan sebuah artikel yang bagus menjelaskan beberapa hal yang dilarang dalam mode ketat (perhatikan bahwa ini bukan daftar eksklusif):

Cakupan

Secara historis, JavaScript telah bingung tentang bagaimana fungsi   scoped. Kadang-kadang mereka tampaknya statis scoped, tetapi beberapa   fitur membuatnya berperilaku seperti mereka secara dinamis scoped. Ini adalah   membingungkan, membuat program sulit dibaca dan dipahami.   Kesalahpahaman menyebabkan bug. Ini juga masalah kinerja.   Scoping statis akan memungkinkan pengikatan variabel terjadi di kompilasi   waktu, tetapi persyaratan untuk lingkup dinamis berarti harus mengikat   ditangguhkan untuk waktu proses, yang datang dengan kinerja yang signifikan   penalti.

Mode ketat mengharuskan semua pengikatan variabel dilakukan secara statis.   Itu berarti bahwa fitur yang sebelumnya membutuhkan pengikatan dinamis   harus dihilangkan atau dimodifikasi. Secara khusus, dengan pernyataan itu   dihilangkan, dan kemampuan fungsi eval untuk mengutak-atik   lingkungan pemanggilnya sangat dibatasi.

Salah satu manfaat dari kode yang ketat adalah alat-alat seperti YUI Compressor   dapat melakukan pekerjaan lebih baik saat memprosesnya.

Variabel Global Tersirat

JavaScript menyiratkan variabel global. Jika   Anda tidak secara eksplisit mendeklarasikan variabel, variabel global adalah   secara implisit dinyatakan untuk Anda. Ini mempermudah pemrograman   pemula karena mereka dapat mengabaikan beberapa layanan dasar mereka   tugas-tugas. Tetapi itu membuat manajemen program yang lebih besar jauh lebih banyak   sulit dan secara signifikan menurunkan keandalan. Jadi secara ketat   mode, variabel global tersirat tidak lagi dibuat. Kamu harus   secara eksplisit menyatakan semua variabel Anda.

Kebocoran Global

Ada sejumlah situasi yang dapat menyebabkan this   untuk terikat pada objek global. Misalnya, jika Anda lupa   menyediakan new awalan saat memanggil fungsi konstruktor,   konstruktor this akan terikat secara tak terduga ke objek global, jadi   bukannya menginisialisasi objek baru, melainkan akan diam-diam   merusak variabel global. Dalam situasi ini, mode ketat akan   bukannya mengikat this untuk undefined, yang akan menyebabkan konstruktor untuk   melemparkan pengecualian sebagai gantinya, memungkinkan kesalahan untuk dideteksi banyak   lebih cepat.

Kegagalan Bising

JavaScript selalu memiliki properti hanya-baca, tetapi Anda   tidak dapat membuatnya sendiri hingga ES5 Object.createProperty   fungsi terkena kemampuan itu. Jika Anda mencoba memberikan nilai   ke properti hanya-baca, itu akan gagal secara diam-diam. Tugas akan   tidak mengubah nilai properti, tetapi program Anda akan diproses sebagai   meskipun itu. Ini adalah bahaya integritas yang dapat menyebabkan program   masuk ke keadaan yang tidak konsisten. Dalam mode ketat, mencoba mengubah a   properti read-only akan memberikan pengecualian.

Oktal

Representasi oktal (atau basis 8) angka sangat luar biasa   berguna saat melakukan pemrograman tingkat mesin pada mesin yang kata-katanya   ukuran merupakan kelipatan 3. Anda perlu oktal saat bekerja dengan CDC   6600 mainframe, yang memiliki ukuran kata 60 bit. Jika Anda bisa membaca   oktal, Anda bisa melihat sebuah kata sebagai 20 digit. Dua digit diwakili   kode op, dan satu digit mengidentifikasi satu dari 8 register. Selama   transisi lambat dari kode mesin ke bahasa tingkat tinggi, itu   dianggap berguna untuk memberikan bentuk oktal dalam bahasa pemrograman.

Dalam C, representasi oktal yang sangat disayangkan adalah   dipilih: Memimpin nol. Jadi di C, 0100 berarti 64, bukan 100, dan 08 adalah   kesalahan, tidak 8. Bahkan lebih sayangnya, anakronisme ini telah terjadi   disalin ke hampir semua bahasa modern, termasuk JavaScript, di mana   itu hanya digunakan untuk membuat kesalahan. Tidak ada tujuan lain. Jadi dalam   mode ketat, bentuk oktal tidak lagi diizinkan.

Dan sebagainya

Argumen pseudo array menjadi sedikit lebih banyak   array-like dalam ES5. Dalam mode ketat, itu kehilangan nya callee dan caller   properti. Ini memungkinkan Anda untuk lulus arguments tidak dipercaya   kode tanpa meninggalkan banyak konteks rahasia. Juga    arguments properti fungsi dihilangkan.

Dalam mode ketat, kunci duplikat dalam fungsi literal akan menghasilkan   kesalahan sintaks. Fungsi tidak boleh memiliki dua parameter dengan nama yang sama.   Fungsi tidak boleh memiliki variabel dengan nama yang sama dengan salah satu fungsinya   parameter. Fungsi tidak bisa delete variabelnya sendiri. Sebuah upaya untuk    delete properti yang tidak dapat dikonfigurasi sekarang memberikan pengecualian. Primitif   nilai-nilai tidak dibungkus secara implisit.


Kata yang dicadangkan untuk versi JavaScript di masa mendatang

ECMAScript 5 menambahkan daftar kata-kata yang dilindungi undang-undang. Jika Anda menggunakannya sebagai variabel atau argumen, mode ketat akan menimbulkan kesalahan. Kata-kata yang dicadangkan adalah:

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


Bacaan lebih lanjut


131
2018-01-29 11:35



Saya sangat menyarankan setiap pengembang untuk mulai menggunakan mode ketat sekarang. Ada cukup banyak browser yang mendukungnya sehingga mode ketat akan secara sah membantu menyelamatkan kami dari kesalahan yang bahkan tidak kami ketahui ada di kode Anda.

Rupanya, 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 kita telah menangkap semuanya. Tentunya kita tidak hanya melempar use strict dalam kode kami dan menganggap tidak ada kesalahan. Jadi churn 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 tempelkan skrip Anda, dan itu akan dengan cepat memindai masalah dan kesalahan yang nyata dalam kode Anda.


122
2017-07-05 19:38