JSLint aniden rapor veriyor: "Katı kullanın" işlev formunu kullanın


930

Ben beyanı dahil ediyorum:

"use strict";

Javascript dosyalarımın çoğunun başında.

JSLint bu konuda daha önce hiç uyarmadı. Ama şimdi, diyor ki:

"Katı kullanın" işlev formunu kullanın.

Herkes "işlev formu" ne olacağını biliyor mu?

Yanıtlar:


1010

'use strict';Bir kaydırma işlevine ilk ifade olarak dahil edilir, böylece yalnızca bu işlevi etkiler. Bu, katı olmayan komut dosyalarını birleştirirken sorunları önler.

Douglas Crockford'un son blog yazısı için Strict Mode Is Coming To Town .

Bu yayından örnek:

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

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

Güncelleme: Anında işlev sarmak istemiyorsanız (örneğin, bir düğüm modülüdür), uyarıyı devre dışı bırakabilirsiniz.

İçin Multi-Meter (başına Zhami ):

/*jslint node: true */

İçin JSHint :

/*jshint strict:false */

veya ( Laith Shadeed başına )

/* jshint -W097 */

JSHint'ten keyfi bir uyarıyı devre dışı bırakmak için, JSHint kaynak kodundaki ( dokümanlardaki ayrıntılar ) haritayı kontrol edin .

Güncelleme 2: JSHintnode:boolean seçeneği destekler . .jshintrcGithub'a bakınız .

/* jshint node: true */

1
Visual Studio için JSLint'de bu seçenek: "Küresel ES5 katı izin ver"
Jowen

10
Düğüm uygulamaları için bu bir anlam ifade etmiyor. -1
bevacqua

1
Merhaba Nico, cevabı güncelledim, düğüm için şunu yazabilirsiniz: / * jshint -W097 * / bu uyarıyı devre dışı bırakmak için
Laith Shadeed

@LaithShadeed /*jshint strict:false */Ne yaptığınızı daha net hale getirmek için bir alternatif olacaktır (sayısal kodunuzda bilmediğim belirli bir fayda yoksa)
bdukes

2
Gerçekten metinlerdir değil @Noumenon, bu kod çalışıyor ortamını değiştiren bir direktif bu. İşte yeni ES6 sözdizimi (modülleri ve sınıflar) varsayılan olarak sıkıdır (bkz dedi ecma-international.org/ecma-262/6.0/ # sec-strict-mode-code ), bu nedenle bunun her yerde çöp olması gerekmez. Bu arada, tüm kodlarınızı bir dosyada sadece bir "use strict";kez belirtmek için bir IIFE içine sarabilirsiniz .
bdukes

217

NodeJS için modül yazıyorsanız, bunlar zaten kapsüllenmiştir. JSLint'e dosyanızın üst kısmına dahil ederek düğümünüz olduğunu söyleyin:

/*jslint node: true */

2
Bilginize, bu seçenek JSLint için çalışır, ancak JSHint bu yönerge ile katılık uyarısını kapatmaz. JSHint için deneyin/*jshint strict:false */
bdukes

4
JSHint v2.9.2 ile bana söz verdi. "node": true.Jshintrc
RyanM

71

Bunun yerine jshint kullanmanızı öneririm .

Bu uyarının üzerinden bastırılmasını sağlar /*jshint globalstrict: true*/.

Bir kitaplık yazıyorsanız, yalnızca kodunuz modüller halinde nodejs'lerde olduğu gibi global katı kullanılmasını öneririm.

Aksi takdirde, kitaplığınızı kullanan herkesi katı moda zorlarsınız.



4
Bilginize: JSHint'teki globalstrict seçeneği değişti. strict: 'global'Şimdi deneyin ve bkz. Jshint.com/docs/options/#globalstrict
Hovis Biddle

17

Cross Platform JavaScript blog gönderisini takiben bir Node.js / browserify uygulaması oluşturmaya başladım . Bu sorunla karşılaştım, çünkü yeni Gruntfile'm jshint'i geçmedi.

Neyse ki Grunt hakkındaki Leanpub kitabında bir cevap buldum :

Şimdi denersek, Gruntfile'ımızı tararız ve bazı hatalar alırız:

$ 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.

Her iki hata da Gruntfile bir Düğüm programı olduğundan ve varsayılan olarak JSHint'in moduleve dize sürümünü tanımıyor veya kullanımına izin vermiyor use strict. Düğüm programlarımızı kabul edecek bir JSHint kuralı belirleyebiliriz. Şimdi jshint görev yapılandırmamızı düzenleyelim ve bir seçenek anahtarı ekleyelim:

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

node: trueJshint'i ekleyerek , jshint'i options"Düğüm moduna" koymak için her iki hatayı da benim için kaldırdı.


16

Aşağıdaki içeriğe sahip bir projenin köküne .jslintrc (veya jshint durumunda .jshintrc) dosyası ekleyin:

{
    "node": true
}

15

Dize formunda doğal olarak yanlış bir şey yoktur.

Sıkı olmayan javascript'i birleştirmekten endişe etmek için "küresel" katı formdan kaçınmaktan ziyade, sadece katı olmayan javascript'i katı olarak düzeltmek daha iyidir.


0

Bence herkes bu sorunun "aniden" bölümünü kaçırdı. Büyük olasılıkla, .jshintrc'nizde bir sözdizimi hatası vardır, bu nedenle 'tarayıcı' satırını içermez. Hatanın nerede olduğunu görmek için bir json doğrulayıcı aracılığıyla çalıştırın.


1
Hayır, aniden oldu çünkü çevrimiçi JSLint hizmeti bu özelliği 2010 yılında soru sorulduğunda ekledi.
Quentin

0
process.on('warning', function(e) {
    'use strict';
    console.warn(e.stack);
});
process.on('uncaughtException', function(e) {
    'use strict';
    console.warn(e.stack);
});

bu satırları dosyanızın başlangıç ​​noktasına ekleyin


-4

Bu kadar basit: Tüm kodlarınızla ilgili katı olmak istiyorsanız "use strict";, JavaScript'inizin başına ekleyin .

Ancak, kodunuzun yalnızca bir kısmıyla ilgili katı olmak istiyorsanız, işlev formunu kullanın. Her neyse, JavaScript'inizin başında kullanmanızı tavsiye ederim, çünkü bu daha iyi bir kodlayıcı olmanıza yardımcı olacaktır.


8
Aslında sadece "use strict";JS dosyamın üstüne koyduğumda bu hatayı alıyorum , bu yüzden bu tamamen doğru olmayabilir.
moesef

@moesef Bunun nedeni kodunuzda hatalar olması. Kodlama becerilerinizi daha iyi hale getirmenize ve kodunuzu daha az "gevşek" hale getirmenize yardımcı olmak için sadece orada ... bildirilmemiş değişkenleri vb. Kabul etmeyecektir ...
Jason Stackhouse

11
@ JasonStackhouse: Doğru değil. JSLint, "use strict";kodunuzun en üstüne yerleştirildiği "global" biçimini kabul etmez . Yalnızca "use strict;"bir işleve sarıldığında izin verir . (JS_Hint_, genel formu kullanmanıza izin verir - gerekli ayar için yukarıdaki cevaba bakın).
peterflynn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.