при вызове функции в строгом режиме this равен undefined

Строгий режим доступен начиная с ECMAScript 5.1, который является ограниченным вариантом JavaScript. Это обеспечивает лучшую безопасность и более строгую проверку на ошибки.

Для включения строгого режима, поместите директиву 'use strict' вверху тела функции.

После включения строгий режим повлияет на контекст выполнения, сделав this равным undefined при вызове обычной функции. Теперь контекст выполнения больше не является глобальным объектом, в отличие от случая в предыдущей главе.

// window - глобальный объект
function hello(){
  'use strict';
  // this - это undefined
};
hello();

Пример функции, вызываемой в строгом режиме:

function multiply(a, b) {
  'use strict';  // добавим строгий режим
  console.log(this === undefined);  // => true
  this.myNumber = 20;  // вызовет ошибку
  return a * b;
}
multiply(2, 5);  // => 10
window.myNumber;  // => undefined

Строгий режим активен не только в текущей области видимости, но и во внутренних областях (для всех функций, объявленных внутри):

function foo() {
  'use strict';
  function concat(str1, str2) {
    // в области видимости функции concat() строгий режим также активен
    console.log(this === undefined);  // => true
    return str1 + str2;
  }
  // this в concat() также undefined
  concat('Привет', ' Мир!');  // => "Привет Мир!"
}
foo();

'use strict' находится в верхней части тела функции foo(), что позволяет использовать строгий режим в своей области видимости. Поскольку concat объявлен в области foo(), он наследует строгий режим. А вызов concat('Привет', 'Мир!') делает this также равным undefined.

Один файл JavaScript может содержать как строгий, так и нестрогий режимы. Таким образом, можно иметь разное контекстное поведение в одном скрипте для одного и того же типа вызова:

function nonStrictSum(a, b) {
  // нестрогий режим
  console.log(this === window);  // => true
  return a + b;
}

function strictSum(a, b) {
  'use strict';  // строгий режим
  console.log(this === undefined);  // => true
  return a + b;
}

// this в nonStrictSum() - это объект window
nonStrictSum(5, 6);  // => 11

// this в strictSum() - это undefined
strictSum(8, 12);  // => 20