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

212
20 мая 2018, 14:10

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

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

Answer 1

данное поведение документировано:

Проблема с "this"

Когда вы передаете метод в setTimeout() (или любую другую функцию), то он будет выполнен со значением this, которое может отличаться от того, которое вы ожидаете. Более подробно эта проблема объясняется в руководстве.

Объяснение

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

Замечание: Значение this по умолчанию в callback-методе, вызванном в setTimeout, все равно будет иметь значение window, а не undefined, даже при использовании strict mode.

Answer 2

В дополнение к ответу @teran

таймеры: setTimeout, setInterval, setImmediate не являются частью спецификации ECMA, а предоставляются окружением.

Из-за этого их поведение, в том числе для определения this может отличаться в зависимости от того, где запускается код, например:

  1. браузер - window
  2. nodejs - объект таймера.
Answer 3

Передайте в функцию нужный вам this

var ob = {
  name: 'Name Object',
  count: 1
};
function f() {
  'use strict';
  alert(this.name);
}
setTimeout(f.bind(ob), 0);
READ ALSO
Json to Javascript from file

Json to Javascript from file

задание простое: достать обьекты из json файла и запихнуть в массив в виде обьектовКак это сделать, как это будет работать(можно ссылку на статью,...

199
Проблема с drawImage canvas

Проблема с drawImage canvas

не появлялась картинка вызванная drawImage,но проблема решилась с помощью addEventListener("load", function() {, но как быть с множеством подобных картинок,которые...

222
Как поменять заливку SVG по нажатию на button

Как поменять заливку SVG по нажатию на button

Написал маленький скрипт чтоб по нажатию на BUTTON менялась заливка насоса в формате SVG но почему-то не работает (( Что не так ?

218