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);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
задание простое: достать обьекты из json файла и запихнуть в массив в виде обьектовКак это сделать, как это будет работать(можно ссылку на статью,...
не появлялась картинка вызванная drawImage,но проблема решилась с помощью addEventListener("load", function() {, но как быть с множеством подобных картинок,которые...
Написал маленький скрипт чтоб по нажатию на BUTTON менялась заливка насоса в формате SVG но почему-то не работает (( Что не так ?