Apa itu "mode ketat" dan bagaimana cara menggunakannya?

Jawaban:

152

Tujuan utamanya adalah untuk melakukan pengecekan lebih lanjut.

Cukup tambahkan "use strict";di bagian atas kode Anda, sebelum yang lainnya.

Misalnya, blah = 33;adalah JavaScript yang valid. Itu berarti Anda membuat variabel yang sepenuhnya global blah.

Tetapi dalam mode ketat ini adalah kesalahan karena Anda tidak menggunakan kata kunci "var" untuk mendeklarasikan variabel.

Sebagian besar waktu Anda tidak bermaksud membuat variabel global di tengah-tengah beberapa ruang lingkup arbitrer, jadi sebagian besar waktu yang blah = 33ditulis itu adalah kesalahan dan pemrogram tidak benar-benar menginginkannya menjadi variabel global, maksud mereka untuk menulis var blah = 33.

Ini juga melarang banyak hal yang secara teknis valid untuk dilakukan. NaN = "lol"tidak menghasilkan kesalahan. Itu juga tidak mengubah nilai NaN. Menggunakan ketat ini (dan pernyataan aneh serupa) menghasilkan kesalahan. Kebanyakan orang menghargai ini karena tidak ada alasan untuk pernah menulis NaN = "lol", jadi kemungkinan besar ada kesalahan ketik.

Baca lebih lanjut di halaman MDN tentang mode ketat .

Simon Sarris
sumber
4
ini adalah duplikat persis dari dokumentasi di MDN
nkcmr
23
Apa yang tidak Anda pahami tentang kegunaannya? Ini bertujuan untuk membantu pengembangan dengan menangkap hal-hal yang valid-tetapi-kemungkinan besar-error.
Simon Sarris
Apa yang Anda maksud dengan "Menggunakan ketat ini" ?
Peter Mortensen
35

Salah satu aspek dari mode ketat yang belum disebutkan dalam jawaban Simon adalah mode ketat diatur thiske undefineddalam fungsi yang dipanggil melalui pemanggilan fungsi.

Jadi hal seperti ini

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

akan menyebabkan kesalahan saat privateMethoddipanggil (karena Anda tidak dapat menambahkan properti ke undefined), daripada menambahkan bproperti ke objek global secara tidak berguna.

Adam Rackis
sumber
4
ya perlu menambahkan privateMethod.bind(this)();dan menelepon dengannew jsbin.com
hlcs
Pembatasan terpenting dalam mode ketat: docs.microsoft.com/en-us/scripting/javascript/advanced/…
Krishna Mohan
23

Mode ketat ditambahkan sehingga akan ada subset ECMAScript yang dapat dianalisis secara statis dengan mudah yang akan menjadi target yang baik untuk versi bahasa yang akan datang. Mode ketat juga dirancang dengan harapan bahwa pengembang yang membatasi diri pada mode ketat akan membuat lebih sedikit kesalahan dan bug yang mereka buat akan terwujud dengan cara yang lebih jelas.

Harmoni , yang diharapkan akan menjadi versi utama ECMAScript berikutnya akan dibangun di atas ES5 yang ketat.

Harmoni dibangun di atas mode ketat ES5 untuk menghindari terlalu banyak mode.

Beberapa eksperimen bahasa lain juga bergantung pada mode ketat. SES bergantung pada analisis mode ketat ES5.

Eksperimen Desain SES (Secure ECMAScript)

Rancang Bahasa Pemrograman Kemampuan Objek dengan menghapus atau memperbaiki fitur di ES5 / Strict.

Harus ada terjemahan langsung dari SES ke ES5 / Strict.

Lampiran C dari standar menjelaskan perbedaan antara mode ketat dan mode normal.

Pembatasan dan pengecualian mode ketat

  • Pengenal "implements", "interface", "let", "package", "private", "protected", "public", "static", dan "yield" diklasifikasikan sebagai token FutureReservedWord dalam kode mode ketat. (7.6.12 [?]).
  • Implementasi yang sesuai, saat memproses kode mode ketat, tidak boleh memperluas sintaks NumericLiteral (7.8.3) untuk menyertakan OctalIntegerLiteral seperti yang dijelaskan di B.1.1.
  • Implementasi yang sesuai, saat memproses kode mode ketat (lihat 10.1.1), mungkin tidak memperluas sintaks EscapeSequence untuk menyertakan OctalEscapeSequence seperti yang dijelaskan di B.1.2.
  • Penetapan ke pengenal yang tidak dideklarasikan atau referensi yang tidak dapat diselesaikan tidak membuat properti di objek global. Ketika penetapan sederhana terjadi dalam kode mode ketat, LeftHandSide-nya tidak boleh mengevaluasi ke Referensi yang tidak dapat diselesaikan. Jika tidak, pengecualian ReferenceError dilemparkan (8.7.2). LeftHandSide juga mungkin bukan referensi ke properti data dengan nilai atribut {[[Writable]]: false}, ke properti pengakses dengan nilai atribut {[[Set]]: undefined}, atau ke yang tidak ada properti sebuah objek yang properti internalnya [[Extensible]] memiliki nilai false. Dalam kasus ini pengecualian TypeError dilemparkan (11.13.1).
  • Pengidentifikasi eval atau argumen mungkin tidak muncul sebagai LeftHandSideExpression dari operator Assignment (11.13) atau dari PostfixExpression (11.3) atau sebagai UnaryExpression yang dioperasikan oleh Prefix Increment (11.4.4) atau operator Prefix Decrement (11.4.5) . Objek argumen untuk fungsi mode ketat menentukan properti pengakses yang tidak dapat dikonfigurasi bernama "pemanggil" dan "callee" yang memunculkan pengecualian TypeError pada akses (10.6).
  • Objek argumen untuk fungsi mode ketat tidak secara dinamis membagikan nilai properti terindeks arraynya dengan binding parameter formal yang sesuai dari fungsinya. (10.6). Untuk fungsi mode ketat, jika objek argumen dibuat, pengikatan argumen pengenal lokal ke objek argumen tidak dapat diubah dan karenanya mungkin bukan target ekspresi penugasan. (10.5).
  • Ini adalah SyntaxError jika kode mode ketat berisi ObjectLiteral dengan lebih dari satu definisi properti data (11.1.5). Ini adalah SyntaxError jika Identifier "eval" atau "argumen" Identifier muncul sebagai Identifier di PropertySetParameterList dari PropertyAssignment yang terdapat dalam kode ketat atau jika FunctionBody-nya adalah kode ketat (11.1.5).
  • Kode eval mode ketat tidak dapat membuat contoh variabel atau fungsi dalam lingkungan variabel pemanggil untuk eval. Sebaliknya, lingkungan variabel baru dibuat dan lingkungan tersebut digunakan untuk deklarasi yang mengikat instantiation untuk kode eval (10.4.2).
  • Jika ini dievaluasi dalam kode mode ketat, maka nilai ini tidak dipaksakan ke objek. Nilai null atau undefined ini tidak dikonversi ke objek global dan nilai primitif tidak dikonversi ke objek pembungkus. Nilai ini diteruskan melalui panggilan fungsi (termasuk panggilan yang dibuat menggunakan Function.prototype.apply dan Function.prototype.call) tidak memaksa nilai ini diteruskan ke objek (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
  • Ketika operator delete terjadi dalam kode mode ketat, SyntaxError dilemparkan jika UnaryExpression-nya adalah referensi langsung ke variabel, argumen fungsi, atau nama fungsi (11.4.1).
  • Ketika operator delete terjadi dalam kode mode ketat, TypeError dilemparkan jika properti yang akan dihapus memiliki atribut {[[Configurable]]: false} (11.4.1). Ini adalah SyntaxError jika VariableDeclaration atau VariableDeclarationNoIn terjadi dalam kode yang ketat dan Identifier-nya adalah eval atau argumen (12.2.1).
  • Kode mode ketat mungkin tidak menyertakan WithStatement. Terjadinya WithStatement dalam konteks seperti itu adalah SyntaxError (12.10).
  • Ini adalah SyntaxError jika TryStatement dengan Catch terjadi dalam kode yang ketat dan Identifier dari produksi Catch adalah eval atau argumen (12.14.1)
  • Ini adalah SyntaxError jika pengidentifikasi eval atau argumen muncul dalam FormalParameterList dari mode ketat FunctionDeclaration atau FunctionExpression (13.1)
  • Fungsi mode ketat mungkin tidak memiliki dua atau lebih parameter formal yang memiliki nama yang sama. Upaya untuk membuat fungsi seperti itu menggunakan konstruktor FunctionDeclaration, FunctionExpression, atau Function adalah SyntaxError (13.1, 15.3.2).
  • Implementasi tidak boleh memperluas, melebihi yang ditentukan dalam spesifikasi ini, makna dalam fungsi mode ketat dari properti bernama pemanggil atau argumen dari instance fungsi. Kode ECMAScript tidak boleh membuat atau mengubah properti dengan nama ini pada objek fungsi yang sesuai dengan fungsi mode ketat (10.6, 13.2, 15.3.4.5.3).
  • Ini adalah SyntaxError untuk digunakan dalam kode mode ketat pengenal eval atau argumen sebagai Pengenal dari FunctionDeclaration atau FunctionExpression atau sebagai nama parameter formal (13.1). Mencoba mendefinisikan secara dinamis fungsi mode ketat seperti itu menggunakan konstruktor Fungsi (15.3.2) akan memunculkan pengecualian SyntaxError.
Mike Samuel
sumber
7

ECMAScript 5 memperkenalkan konsep mode ketat .

Memanggil Mode Ketat dalam Kode

Mode ketat berlaku untuk seluruh skrip atau fungsi individu. Ini tidak berlaku untuk pernyataan blok yang diapit oleh {} kurung kurawal, mencoba menerapkannya ke konteks seperti itu tidak akan menghasilkan apa-apa.

Seluruh Script:

Katakanlah kita membuat app.js, jadi menambahkan skrip penggunaan pernyataan pertama akan memberlakukan mode ketat untuk seluruh kode.

// app.js whole script in strict mode syntax
“use strict”;
// Now you can start writing your code

Mode ketat untuk fungsi:

Untuk menjalankan mode ketat suatu fungsi, letakkan pernyataan yang tepat "gunakan ketat"; di awal badan fungsi sebelum pernyataan lainnya.

function yourFunc(){
    "use strict";

    // Your function code logic
}

Mode ketat menggabungkan beberapa perubahan pada semantik JavaScript normal. Pertama, mode ketat menghilangkan beberapa kesalahan diam JavaScript dengan mengubahnya menjadi kesalahan lempar.

Misalnya: Kode menggunakan Mode Ketat

Masukkan deskripsi gambar di sini

Dalam contoh kode di atas, tanpa menggunakan mode ketat dalam kode, itu tidak akan menimbulkan kesalahan. Karena kita mengakses variabel xtanpa mendeklarasikannya. Jadi dalam mode ketat, mengakses variabel yang tidak dideklarasikan akan menimbulkan kesalahan.

Sekarang mari kita coba mengakses variabel, x, tanpa mendeklarasikannya tanpa mode ketat.

(function(){
    x = 3;
})();

// Will not throw an error

Keuntungan menggunakan mode ketat:

  • Hilangkan kesalahan diam JavaScript dengan melempar kesalahan.
  • Memperbaiki kesalahan yang menyulitkan mesin JavaScript untuk melakukan pengoptimalan.
  • Membuat kode terkadang berjalan lebih cepat daripada kode identik yang tidak dalam mode ketat
  • Melarang beberapa sintaks yang kemungkinan besar akan ditentukan dalam versi ECMAScript yang akan datang.
Nishant Kumar
sumber
6

Mode ketat membuat beberapa perubahan pada semantik JavaScript normal.

  • mode ketat menghilangkan beberapa kesalahan diam JavaScript dengan mengubahnya menjadi kesalahan lempar.

  • mode ketat memperbaiki kesalahan yang menyulitkan mesin JavaScript untuk melakukan pengoptimalan.

  • mode ketat melarang beberapa sintaks yang kemungkinan besar akan didefinisikan dalam versi ECMAScript yang akan datang.

Renganathan MG
sumber
2

ECMAScript5memperkenalkan beberapa objek dan properti baru dan juga yang disebut "strict mode".

Mode ketat adalah bagian dari bahasa yang mengecualikan fitur yang tidak digunakan lagi. Mode ketat adalah ikut serta dan tidak wajib, artinya jika Anda ingin kode Anda dijalankan dalam mode ketat, Anda menyatakan niat Anda menggunakan (sekali per fungsi, atau sekali untuk seluruh program) string berikut:

"use strict";
Vahid Hallaji
sumber
Bukankah itu lebih dari satu bagian? Suka memeriksa variabel yang tidak ditentukan?
Peter Mortensen
2

2017 dan akhirnya saya menemukan dokumentasinya:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

Mode ketat adalah cara untuk ikut serta ke varian JavaScript yang dibatasi. Mode ketat bukan hanya sebuah subset: ia sengaja memiliki semantik yang berbeda dari kode normal. Browser yang tidak mendukung mode ketat akan menjalankan kode mode ketat dengan perilaku berbeda dari browser yang mendukungnya, jadi jangan mengandalkan mode ketat tanpa pengujian fitur untuk dukungan aspek yang relevan dari mode ketat. Kode mode ketat dan kode mode non-ketat dapat hidup berdampingan, sehingga skrip dapat memilih mode ketat secara bertahap.


Mode ketat membuat beberapa perubahan pada semantik JavaScript normal. Pertama, mode ketat menghilangkan beberapa kesalahan diam JavaScript dengan mengubahnya menjadi kesalahan lempar. Kedua, mode ketat memperbaiki kesalahan yang menyulitkan mesin JavaScript untuk melakukan pengoptimalan: kode mode ketat terkadang dapat dibuat agar berjalan lebih cepat daripada kode identik yang bukan mode ketat. Ketiga, mode ketat melarang beberapa sintaksis yang kemungkinan besar akan didefinisikan dalam versi ECMAScript yang akan datang.

Tilak Maddy
sumber
0

Pertanyaan:

Berikut adalah masalah yang saya temui. Saya mengikuti tutorial dan akhirnya mencoba mengompilasi scssfile berikut dan mencoba menghasilkan kode CSS darinya,

.fatty{
  width: percentage(6/7);
}

menggunakan gulpfile.jstugas berikut :

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

Jadi kesalahan yang saya dapatkan adalah sebagai berikut:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

Larutan:

Jadi itu menunjukkan kepada saya index.jsfile yang ada di dalam modul gulp-sass saya (yang pada dasarnya terkunci dan tidak boleh diedit). Tetapi jika saya pergi dengan paksa dan menambahkan "use_strict"di bagian atas index.jsfile itu, itu menjalankan tugas saya dengan lancar.

Saya tidak berdaya, jadi saya terus menggunakan ini sebagai solusi! Tetapi kemudian setelah melalui beberapa Tanya Jawab Stack Overflow lainnya , saya melihat jawaban berikut sebagai berikut:

sudo npm install -g n
sudo n stable

Dan segera setelah saya memperbarui Node.js saya (ke versi 10.x), dan kemudian membangun kembali Gulp dengan menjalankan perintah berikut sebagai Terminal, ia menginstruksikan saya:

npm rebuild node-sass --force

Dan semuanya baik-baik saja. Jadi begitulah cara mengatasinya. Saya telah membatalkan perubahan yang saya lakukan untuk index.jsfile modul Gulp.js. Dan sekarang sudah lancar.

Randika Vishman
sumber