JavaScript: строгий режим и анонимные функции

Почти все мои JS файлы обернуты анонимными функциями. Если я включаю "use strict"; вне анонимной функции, строгий режим все еще применяется к анонимной функции?

Например, строгий режим применяется к внутреннему телу анонимной функции в script ниже:

"use strict";

(function() {
    // Is this code running under strict mode?
})(); 

Ответ 1

Согласно статье Джона Ресига, если вы включите строгий режим в верхней части файла, это относится ко всему файлу / script. Итак, да, это означает, что он будет применяться в анонимной функции.

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

Отредактировано для добавления: здесь полная спецификация. Один из важных пунктов:

10.1.1 Строковый код режима

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

  • Глобальный код - это строгий глобальный код, если он начинается с директивы Prologue, содержащей директиву Use Strict (см. 14.1).
  • Eval code - это строгий код eval, если он начинается с директивы Prologue, которая содержит директиву Use Strict или если вызов eval является прямым вызовом (см. 15.1.2.1.1) для функции eval, которая содержится в строгом режиме код.
  • Функциональный код, являющийся частью FunctionDeclaration, FunctionExpression или accessor PropertyAssignment, является строгим функциональным кодом, если его FunctionDeclaration, FunctionExpression или PropertyAssignment содержится в коде строгого режима или если код функции начинается с директивы Prologue, которая содержит строку Use Strict Директива.
  • Код функции, который поставляется в качестве последнего аргумента встроенному конструктору функций, является строгим кодом функции, если последний аргумент представляет собой строку, которая при обработке как FunctionBody начинается с директивного пролога, содержащего директиву Use Strict.