Не рекомендуется использовать «строгий» в ES6?

200

Я еще не знаком с ECMAScript 6. Я только что клонировал репозиторий React Starter Kit, который использует ES6 для кода приложения. Я был удивлен, увидев, что линтер настроен так, чтобы запрещать вхождения use strictдирективы, что, как я думал, было рекомендовано в JavaScript до версии ES6. Так какой в ​​этом смысл?

Midiparse
источник

Ответы:

257

Модули ES6 всегда в строгом режиме. Чтобы процитировать соответствующую часть спецификации :

10.2.1 Код строгого режима

Синтаксическая единица скрипта ECMAScript может обрабатываться с использованием синтаксиса и семантики неограниченного или строгого режима. Код интерпретируется как код строгого режима в следующих ситуациях:

  • Глобальный код является кодом строгого режима, если он начинается с Пролога Директивы, который содержит Директиву Строгого Использования (см. 14.1.1).
  • Код модуля - это всегда строгий код режима.
  • Все части ClassDeclaration или ClassExpression являются строгим кодом режима.
  • Eval-код - это код строгого режима, если он начинается с Пролога директивы, который содержит директиву Use Strict, или если вызов eval является прямым eval (см. 12.3.4.1), который содержится в коде строгого режима.
  • Код функции - это код строгого режима, если связанный код FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition или ArrowFunction содержится в коде строгого режима или если код, который создает значение внутреннего слота функции [[ECMAScriptCode]], начинается с директивного пролога который содержит директиву об использовании строго.
  • Код функции, который предоставляется в качестве аргументов для встроенных конструкторов Function и Generator, является кодом строгого режима, если последний аргумент является строкой, которая при обработке является FunctionBody, которая начинается с пролога директивы, содержащей директиву Use Strict.
Кит Сунде
источник
11
В чем разница между глобальным кодом и кодом модуля? Я думаю, что я неправильно понимаю, так как код модуля для меня означает все в module.js, если мне требуется ('module').
Май Оукс
8
@BrynnMahsman ES2015 имеет встроенные модули. CommonJS - это просто библиотека, не имеющая ничего общего с языком.
Кит Сунд
18
Спасибо за ваш ответ. Так разве это не модуль ES6, если он не использует ключевые слова импорта / экспорта? Сейчас я использую Node 4, и у меня нет доступа к ключевым словам импорта / экспорта, и я просто использую модуль CommonJS module.exports и require () вместе с функциями ES6, включенными по умолчанию. Это объяснило бы, почему я должен использовать строгий режим в верхней части каждого файла. Так что технически я все еще пишу модули CommonJS с некоторыми функциями ES6, включенными в V8?
May Oakes
7
Для детального изучения "это модуль?" , см. nczonline.net/blog/2016/04/… "... хотя наличие импорта или экспорта может указывать на модуль, отсутствие импорта или экспорта явно не указывает на то, что файл не является модулем. нет эффективного способа автоматически определить, что файл является модулем во время анализа. "
17
1
Что именно представляет собой «модуль»? Я получаю сообщение об strictошибке (с предустановкой AirBnB ) в сценарии, который состоит только из "use strict"; console.log('foo'). Это модуль?
Дан Даскалеску