JSLint неожиданно сообщает: используйте функциональную форму «используйте строгий»

930

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

"use strict";

в начале большинства моих файлов Javascript.

JSLint никогда раньше не предупреждал об этом. Но теперь это говорит:

Используйте форму функции «используйте строгий».

Кто-нибудь знает, какой будет «форма функции»?

Zhami
источник

Ответы:

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 */
bdukes
источник
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 */
Zhami
источник
2
Кстати, эта опция работает для JSLint, но JSHint не отключает предупреждение о строгости с помощью этой директивы. Для JSHint попробуйте/*jshint strict:false */
bdukes
4
Записано для меня с JSHint v2.9.2. Добавлено "node": trueв .jshintrc
RyanM
71

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

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

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

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

Торстен Лоренц
источник
stackoverflow.com/questions/6803305/…
Даниэль Кутик
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 в «режим узла», удалило обе ошибки для меня.

qris
источник
16

Добавьте файл .jslintrc (или .jshintrc в случае jshint) в корень вашего проекта со следующим содержимым:

{
    "node": true
}
Сахил Ахаджа
источник
15

В строковой форме нет ничего плохого.

Вместо того чтобы избегать «глобальной» строгой формы для беспокойства по поводу конкатенации нестрогого javascript, вероятно, лучше просто исправить чертовски нестрогий javascript, чтобы он был строгим.

glycoslave
источник
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);
});

добавить эти строки в начальную точку вашего файла

DB K
источник
-4

Вот как это просто: если вы хотите быть строгим со всем своим кодом, добавьте "use strict";в начале ваш JavaScript.

Но если вы хотите быть строгим только с некоторым кодом, используйте форму функции. В любом случае, я бы порекомендовал вам использовать его в начале вашего JavaScript, потому что это поможет вам стать лучшим программистом.

Джейсон Стэкхаус
источник
8
Я действительно получаю эту ошибку, когда помещаю только "use strict";верхнюю часть моего файла JS, так что это может быть не совсем так.
Moesef
@moesef Это потому, что у вас есть ошибки в вашем коде. Это только для того, чтобы улучшить ваши навыки кодирования и сделать ваш код менее «свободным» ... он не будет принимать необъявленные переменные и т. Д ...
Джейсон Стэкхаус
11
@JasonStackhouse: не правда. JSLint не примет «глобальную» форму "use strict";, где он просто помещается вверху вашего кода. Это разрешено только "use strict;"при включении в функцию. (JS_Hint_ позволяет вам использовать глобальную форму, хотя - см. Ответ выше для необходимой настройки).
peterflynn