function f() {
'use strict';
alert(this);
}
f(); // выводится undefined
setTimeout(f, 0); // выводится [object Window]
Т. е. при вызове функции через setTimeout игнорируется 'use strict'. Почему?
данное поведение документировано:
Проблема с "this"
Когда вы передаете метод в setTimeout() (или любую другую функцию), то он будет выполнен со значением this, которое может отличаться от того, которое вы ожидаете. Более подробно эта проблема объясняется в руководстве.
Объяснение
Код, исполняемый в setTimeout(), имеет другой контекст выполнения, нежели функция, вызвавшая setTimeout. Для установки значения this вызываемой функции применяются обычные правила, и если вы не установили значение this при вызове или, используя bind, то значением по умолчанию в non-strict режиме будет объект global (или window), а в strict-режиме значение undefined. Оно не будет таким же как значение this функции, вызвавшей setTimeout.
Замечание: Значение this по умолчанию в callback-методе, вызванном в setTimeout, все равно будет иметь значение window, а не undefined, даже при использовании strict mode.
В дополнение к ответу @teran
таймеры: setTimeout, setInterval, setImmediate не являются частью спецификации ECMA, а предоставляются окружением.
Из-за этого их поведение, в том числе для определения this может отличаться в зависимости от того, где запускается код, например:
windowПередайте в функцию нужный вам this
var ob = {
name: 'Name Object',
count: 1
};
function f() {
'use strict';
alert(this.name);
}
setTimeout(f.bind(ob), 0);
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости