JSLint tiba-tiba melaporkan: Gunakan bentuk fungsi "gunakan ketat"

930

Saya sertakan pernyataan:

"use strict";

di awal sebagian besar file Javascript saya.

JSLint belum pernah memperingatkan tentang ini. Tapi sekarang, mengatakan:

Gunakan bentuk fungsi "gunakan ketat".

Adakah yang tahu "bentuk fungsi" nantinya?

Zhami
sumber

Jawaban:

1010

Sertakan 'use strict';sebagai pernyataan pertama dalam fungsi pembungkus, sehingga hanya memengaruhi fungsi itu. Ini mencegah masalah ketika menggabungkan skrip yang tidak ketat.

Lihat posting blog terbaru Douglas Crockford, Mode Ketat Datang ke Kota .

Contoh dari pos itu:

(function () {
   'use strict';
   // this function is strict...
}());

(function () {
   // but this function is sloppy...
}());

Pembaruan: Jika Anda tidak ingin membungkus dalam fungsi langsung (misalnya itu adalah modul simpul), maka Anda dapat menonaktifkan peringatan.

Untuk JSLint (per Zhami ):

/*jslint node: true */

Untuk JSHint :

/*jshint strict:false */

atau (per Laith Shadeed )

/* jshint -W097 */

Untuk menonaktifkan peringatan sewenang-wenang dari JSHint, periksa peta dalam kode sumber JSHint (perincian dalam dokumen ).

Pembaruan 2: opsi dukungan JSHintnode:boolean . Lihat .jshintrcdi github .

/* jshint node: true */
bdukes
sumber
1
Dalam JSLint untuk Visual Studio itu adalah pilihan: "Izinkan global ES5 ketat"
Jowen
10
Ini tidak masuk akal untuk aplikasi Node. -1
bevacqua
1
Halo Nico, saya memperbarui jawabannya, untuk simpul Anda dapat mengetik: / * jshint -W097 * / untuk menonaktifkan peringatan ini
Laith Shadeed
@LaithShadeed Alternatif /*jshint strict:false */, untuk membuatnya lebih jelas apa yang Anda lakukan (kecuali ada manfaat khusus untuk kode numerik Anda yang saya tidak tahu)
bdukes
2
@Noumenon itu bukan benar-benar boilerplate, itu adalah arahan yang mengubah lingkungan kode Anda berjalan masuk. Yang mengatakan, sintaks ES6 baru (modul dan kelas) ketat secara default (lihat ecma-international.org/ecma-262/6.0/ # sec-strict-mode-code ), jadi maju ini tidak perlu dikotori di mana-mana. Sementara itu, Anda dapat membungkus semua kode Anda dalam IIFE hanya harus menentukan "use strict";satu kali per file.
bdukes
217

Jika Anda menulis modul untuk NodeJS, mereka sudah dienkapsulasi. Beri tahu JSLint bahwa Anda memiliki simpul dengan memasukkan di bagian atas file Anda:

/*jslint node: true */
Zhami
sumber
2
FYI, opsi ini berfungsi untuk JSLint, tetapi JSHint tidak mematikan peringatan ketat dengan arahan ini. Untuk JSHint, coba/*jshint strict:false */
bdukes
4
Worded for me with JSHint v2.9.2. Ditambahkan "node": trueke .jshintrc
RyanM
71

Saya sarankan untuk menggunakan jshint saja.

Memungkinkan untuk menekan peringatan ini melalui /*jshint globalstrict: true*/.

Jika Anda menulis perpustakaan, saya hanya akan menyarankan menggunakan global ketat jika kode Anda dienkapsulasi ke dalam modul seperti halnya dengan nodejs.

Kalau tidak, Anda akan memaksa semua orang yang menggunakan perpustakaan Anda ke mode ketat.

Thorsten Lorenz
sumber
4
FYI: Opsi globalstrict di JSHint telah berubah. Coba strict: 'global'sekarang, dan lihat jshint.com/docs/options/#globalstrict
Hovis Biddle
17

Saya mulai membuat aplikasi Node.js / browserify setelah posting blog Cross Platform JavaScript . Dan saya mengalami masalah ini, karena Gruntfile baru saya tidak lulus jshint.

Untungnya saya menemukan jawaban di buku Leanpub tentang Grunt :

Jika kami mencobanya sekarang, kami akan memindai Gruntfile kami ... dan mendapatkan beberapa kesalahan:

$ grunt jshint

Running "jshint:all" (jshint) task
Linting Gruntfile.js...ERROR
[L1:C1] W097: Use the function form of "use strict".
'use strict';
Linting Gruntfile.js...ERROR
[L3:C1] W117: 'module' is not defined.
module.exports = function (grunt) {

Warning: Task "jshint:all" failed. Use --force to continue.

Kedua kesalahan tersebut karena Gruntfile adalah program Node, dan secara default JSHint tidak mengenali atau mengizinkan penggunaan moduledan versi string dari use strict. Kita dapat menetapkan aturan JSHint yang akan menerima program Node kita. Mari kita edit konfigurasi tugas jshint kami dan menambahkan kunci opsi:

jshint: {
  options: {
    node: true
  },
}

Menambahkan node: trueke jshint options, untuk memasukkan jshint ke "mode Node", menghapus kedua kesalahan untuk saya.

qris
sumber
16

Tambahkan file .jslintrc (atau .jshintrc dalam kasus jshint) di root proyek Anda dengan konten berikut:

{
    "node": true
}
Sahil Ahuja
sumber
15

Tidak ada yang salah dengan bentuk string.

Daripada menghindari bentuk ketat "global" karena khawatir akan menggabungkan javascript yang tidak ketat, mungkin lebih baik memperbaiki javascript yang tidak ketat itu dengan ketat.

glikoslave
sumber
0

Saya pikir semua orang melewatkan bagian "tiba-tiba" dari pertanyaan ini. Kemungkinan besar .jshintrc Anda memiliki kesalahan sintaks, jadi tidak termasuk baris 'browser'. Jalankan melalui validator json untuk melihat di mana kesalahannya.

Dirigible
sumber
1
Tidak, itu tiba-tiba terjadi karena layanan JSLint online menambahkan fitur itu pada 2010 ketika pertanyaan diajukan.
Quentin
0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

tambahkan baris ini pada titik awal file Anda

DB K
sumber
-4

Begini sederhananya: Jika Anda ingin ketat dengan semua kode Anda, tambahkan "use strict";di awal JavaScript Anda.

Tetapi jika Anda hanya ingin ketat dengan beberapa kode Anda, gunakan formulir fungsi. Bagaimanapun, saya akan merekomendasikan Anda untuk menggunakannya di awal JavaScript Anda karena ini akan membantu Anda menjadi pembuat kode yang lebih baik.

Jason Stackhouse
sumber
8
Saya benar-benar mendapatkan kesalahan ini ketika saya hanya meletakkan "use strict";di bagian atas file JS saya, jadi ini mungkin tidak sepenuhnya benar.
moesef
@moesef Itu karena Anda memiliki kesalahan dalam kode Anda. Itu hanya ada untuk membantu membuat keterampilan pengkodean Anda menjadi lebih baik dan membuat kode Anda lebih sedikit "longgar" ... tidak akan menerima variabel yang tidak dideklarasikan, dll ...
Jason Stackhouse
11
@ JasonStackhouse: Tidak benar. JSLint tidak akan menerima bentuk "global" "use strict";, di mana ia ditempatkan di bagian atas kode Anda. Ini hanya memungkinkan "use strict;"ketika dibungkus dalam suatu fungsi. (JS_Hint_ memungkinkan Anda menggunakan formulir global, - lihat jawaban di atas untuk pengaturan yang diperlukan).
peterflynn