Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Значение this при вызове функции через setTimeout

#javascript #settimeout #this




function f() {
  'use strict';
  alert(this);
}
f(); // выводится undefined
setTimeout(f, 0); // выводится [object Window]




Т. е. при вызове функции через setTimeout игнорируется 'use strict'. Почему?
    


Ответы

Ответ 1



данное поведение документировано: Проблема с "this" Когда вы передаете метод в setTimeout() (или любую другую функцию), то он будет выполнен со значением this, которое может отличаться от того, которое вы ожидаете. Более подробно эта проблема объясняется в руководстве. Объяснение Код, исполняемый в setTimeout(), имеет другой контекст выполнения, нежели функция, вызвавшая setTimeout. Для установки значения this вызываемой функции применяются обычные правила, и если вы не установили значение this при вызове или, используя bind, то значением по умолчанию в non-strict режиме будет объект global (или window), а в strict-режиме значение undefined. Оно не будет таким же как значение this функции, вызвавшей setTimeout. Замечание: Значение this по умолчанию в callback-методе, вызванном в setTimeout, все равно будет иметь значение window, а не undefined, даже при использовании strict mode.

Ответ 2



В дополнение к ответу @teran таймеры: setTimeout, setInterval, setImmediate не являются частью спецификации ECMA, а предоставляются окружением. Из-за этого их поведение, в том числе для определения this может отличаться в зависимости от того, где запускается код, например: браузер - window nodejs - объект таймера.

Ответ 3



Передайте в функцию нужный вам this var ob = { name: 'Name Object', count: 1 }; function f() { 'use strict'; alert(this.name); } setTimeout(f.bind(ob), 0);

Комментариев нет:

Отправить комментарий