Tidak disarankan menggunakan "gunakan ketat" di ES6?

200

Saya belum terbiasa dengan ECMAScript 6. Saya baru saja mengkloning repo React Starter Kit, yang menggunakan ES6 untuk kode aplikasi. Saya terkejut melihat bahwa linter dikonfigurasi untuk melarang kejadian use strictdirektif, yang saya pikir direkomendasikan dalam JavaScript pra-ES6. Jadi apa gunanya?

Midiparse
sumber

Jawaban:

257

Modul ES6 selalu dalam mode ketat. Mengutip bagian yang relevan dari spesifikasi :

10.2.1 Kode Mode Ketat

Unit sintaksis Script ECMAScript dapat diproses menggunakan sintaks dan semantik mode tidak terbatas atau ketat. Kode ditafsirkan sebagai kode mode ketat dalam situasi berikut:

  • Kode global adalah kode mode yang ketat jika dimulai dengan Prolog Arahan yang berisi Arahan Penggunaan Ketat (lihat 14.1.1).
  • Kode modul selalu merupakan kode mode ketat.
  • Semua bagian dari ClassDeclaration atau ClassExpression adalah kode mode yang ketat.
  • Kode Eval adalah kode mode ketat jika diawali dengan Direktif Prolog yang berisi Use Strict Directive atau jika panggilan untuk eval adalah eval langsung (lihat 12.3.4.1) yang terdapat dalam kode mode ketat.
  • Kode fungsi adalah kode mode yang ketat jika terkait FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, atau ArrowFunction terkandung dalam kode mode yang ketat atau jika kode yang menghasilkan nilai slot fungsi [[ECMAScriptCode]] fungsi dimulai dengan Prolog Directive yang berisi Use Strict Directive.
  • Kode fungsi yang disediakan sebagai argumen untuk Konstruktor Fungsi dan Generator yang terpasang adalah kode mode yang ketat jika argumen terakhir adalah String yang ketika diproses adalah FunctionBody yang dimulai dengan Prolog Arahan yang berisi Use Strict Directive.
Kit Sunde
sumber
11
Apa perbedaan antara kode global dan kode modul? Saya pikir saya salah paham, karena kode modul bagi saya berarti segalanya di module.js jika saya memerlukan ('modul').
May Oakes
8
@BrynnMahsman ES2015 memiliki modul asli. CommonJS hanyalah sebuah perpustakaan dan tidak ada hubungannya dengan bahasa.
Kit Sunde
18
Terimakasih atas tanggapan Anda. Jadi bukankah modul ES6 jika tidak menggunakan kata kunci impor / ekspor? Saat ini saya menggunakan Node 4 dan saya tidak memiliki akses untuk mengimpor / mengekspor kata kunci dan saya hanya menggunakan module.exports CommonJS dan memerlukan () bersama dengan fitur ES6 diaktifkan secara default. Ini akan menjelaskan mengapa saya harus menggunakan yang ketat di bagian atas setiap file. Jadi secara teknis saya masih menulis modul CommonJS dengan beberapa fitur ES6 diaktifkan di V8?
May Oakes
7
Untuk pemeriksaan terperinci "apakah ini modul?" , lihat nczonline.net/blog/2016/04/ ... "... sementara keberadaan impor atau ekspor mungkin menunjukkan modul, kurangnya impor atau ekspor tidak secara jelas menunjukkan bahwa file tersebut bukan modul. Jadi ada tidak ada cara efektif untuk mendeteksi secara otomatis bahwa file adalah modul selama parsing. "
ptim
1
Apa sebenarnya "modul" itu? Saya mendapatkan strictkesalahan (dengan preset AirBnB ) pada skrip yang hanya terdiri dari "use strict"; console.log('foo'). Apakah itu modul?
Dan Dascalescu