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 */

или (в соответствии с Laith Shadeed )

/* 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-strict-mode-code ), так что в дальнейшем это не нужно будет засорять везде. В то же время вы можете обернуть весь свой код в IIFE , чтобы указать его "use strict";только один раз для каждого файла.
bdukes

217

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

/*jslint node: true */

2
Кстати, эта опция работает для JSLint, но JSHint не отключает предупреждение о строгости с помощью этой директивы. Для JSHint попробуйте/*jshint strict:false */
bdukes

4
Записано для меня с JSHint v2.9.2. Добавлено "node": trueв .jshintrc
RyanM

71

Я бы предложил вместо этого использовать jshint .

Это позволяет подавить это предупреждение через /*jshint globalstrict: true*/.

Если вы пишете библиотеку, я бы предложил использовать глобальный строгий, если ваш код инкапсулирован в модули, как в случае с nodejs.

В противном случае вы бы принудили всех, кто использует вашу библиотеку, в строгом режиме.



4
К вашему сведению: опция globalstrict в JSHint изменилась. Попробуйте strict: 'global'сейчас и посмотрите jshint.com/docs/options/#globalstrict
Биддл

17

Я начал создавать приложение Node.js / browserify после публикации блога о кросс-платформенном JavaScript . И я столкнулся с этой проблемой, потому что мой новый Gruntfile не прошел jshint.

К счастью, я нашел ответ в книге Leanpub о Grunt :

Если мы попробуем это сейчас, мы просканируем наш 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 имеет синтаксическую ошибку, поэтому он не включает строку 'browser'. Запустите его через валидатор 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 Это потому, что у вас есть ошибки в вашем коде. Это только для того, чтобы улучшить ваши навыки кодирования и сделать ваш код менее «свободным» ... он не будет принимать необъявленные переменные и т. Д ...
Джейсон Стэкхаус

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