JSLint раптом повідомляє: Використовуйте функціональну форму "використовувати строгий"


930

Я включаю твердження:

"use strict";

на початку більшості моїх файлів Javascript.

JSLint ніколи раніше про це не попереджав. Але тепер це, кажучи:

Використовуйте функціональну форму "використовувати суворо".

Хтось знає, якою була б "форма функції"?

Відповіді:


1010

Включіть 'use strict';як перше твердження у функцію обгортання, тому воно впливає лише на цю функцію. Це запобігає проблемам об'єднання сценаріїв, які не є строгими.

Дивіться останню публікацію в блозі Дугласа Крокфорда Суворий режим йде в місто .

Приклад із цієї публікації:

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

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

Оновлення: Якщо ви не хочете перейти до негайної функції (наприклад, це модуль вузла), ви можете відключити попередження.

Для JSLint (за Жамі ):

/*jslint node: true */

Для JSHint :

/*jshint strict:false */

або (за Лаїтом Затіненим )

/* jshint -W097 */

Щоб відключити будь-яке довільне попередження від JSHint, перевірте карту у вихідному коді JSHint (подробиці в документах ).

Оновлення 2: JSHint підтримує node:booleanопцію. Дивіться .jshintrcу github .

/* jshint node: true */

1
У JSLint для Visual Studio є варіант: "Дозволити глобальний ES5 строгий"
Jowen

10
Це не має сенсу для програм Node. -1
bevacqua

1
Привіт Ніко, я оновив відповідь, для вузла ви можете ввести: / * jshint -W097 * /, щоб відключити це попередження
Laith Shadeed

@LaithShadeed Альтернативою було б /*jshint strict:false */, щоб було зрозуміліше, що ви робите (якщо тільки у вашому числовому коді немає особливої ​​користі, про яку я не знаю)
bdukes

2
@Noumenon це не зовсім котлованна плита, це директива, яка змінює середовище, у якому працює ваш код. При цьому новий синтаксис ES6 (модулі та класи) за замовчуванням суворий (див. Ecma-international.org/ecma-262/6.0/ # sec-строгий режим-код ), тому для подальшої роботи це не потрібно буде засмічувати всюди. Тим часом, ви можете загортати весь код у IIFE , щоб вказати лише "use strict";один раз на файл.
бдукс

217

Якщо ви пишете модулі для NodeJS, вони вже інкапсульовані. Скажіть JSLint, що у вас є вузол, включивши вгорі вашого файлу:

/*jslint node: true */

2
FYI, ця опція працює для JSLint, але JSHint не вимикає попередження щодо суворості з цією директивою. Для JSHint спробуйте/*jshint strict:false */
bdukes

4
Сформульовано для мене з JSHint v2.9.2. Додано "node": trueдо .jshintrc
RyanM

71

Я б запропонував використовувати jshint замість цього.

Це дозволяє придушити це попередження через /*jshint globalstrict: true*/.

Якщо ви пишете бібліотеку, я б запропонував використовувати глобальний строгий, лише якщо ваш код інкапсульований у модулі, як у випадку з nodejs.

Інакше ви змусите всіх людей, хто користується вашою бібліотекою, в суворому режимі.



4
FYI: Параметр глобального обмеження в JSHint змінився. Спробуйте strict: 'global'зараз і перегляньте jshint.com/docs/options/#globalstrict
Hovis Biddle

17

Я почав створювати додаток Node.js / переглядати веб-переглядачі, слідуючи публікації блогу Cross Cross Platform JavaScript . І я зіткнувся з цим питанням, тому що мій абсолютно новий Gruntfile не пройшов jshint.

На щастя, я знайшов відповідь у книзі Leanpub про Грунт :

Якщо ми спробуємо зараз, ми скануємо наш Gruntfile… і отримаємо деякі помилки:

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

Обидві помилки пов’язані з тим, що Gruntfile - це програма Node, і JSHint за замовчуванням не розпізнає і не дозволяє використовувати moduleі строкову версію use strict. Ми можемо встановити правило JSHint, яке буде приймати наші програми Node. Відредагуємо конфігурацію завдань jshint та додамо ключ параметра:

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

Додавши node: trueдо jshint options, щоб перевести jshint у "Режим вузла", для мене видалили обидві помилки.


16

Додайте файл .jslintrc (або .jshintrc у випадку jshint) у корінь свого проекту із наступним вмістом:

{
    "node": true
}

15

У формі струни немає нічого поганого.

Замість того, щоб уникати "глобальної" суворої форми для побоювання згуртування не строгого JavaScript, мабуть, краще просто виправити проклятий не суворий JavaScript, щоб бути суворим.


0

Я думаю, що всі пропустили "раптово" частину цього питання. Швидше за все, ваш .jshintrc має помилку синтаксису, тому він не включає рядок 'браузер'. Запустіть його через валідатор json, щоб побачити, де помилка.


1
Ні, це раптом сталося, тому що онлайн-сервіс JSLint додав цю функцію в 2010 році, коли було задано питання.
Квентін

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

додайте ці рядки до початкової точки вашого файлу


-4

Це так просто: Якщо ви хочете бути суворими з усім кодом, додайте "use strict";на початку свого JavaScript.

Але якщо ви хочете бути чіткими лише з деяким кодом, скористайтеся формою функції. У будь-якому випадку, я рекомендую вам використовувати його на початку вашого JavaScript, оскільки це допоможе вам бути кращим кодером.


8
Насправді я отримую цю помилку, коли я розміщую лише "use strict";верхню частину файлу JS, тому це може бути не зовсім правдою.
moesef

@moesef Це тому, що у вас є помилки в коді. Це просто там, щоб допомогти покращити свої навички кодування та зробити ваш код менш "вільним" ... він не прийме незадекларовані змінні тощо ...
Jason Stackhouse

11
@JasonStackhouse: Неправда. JSLint не прийме "глобальну" форму "use strict";, де вона просто розміщена у верхній частині коду. Це дозволяє лише "use strict;"тоді, коли увімкнено функцію. (JS_Hint_ дозволяє використовувати глобальну форму, хоча - див. Відповідь вище для потрібних налаштувань).
peterflynn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.