Почему это не регистрирует undefined в консоли при запуске в окне консоли Chrome?

(function (){
  'use strict';
  function Foo() { 
    this.foo = function() { 
      setTimeout(function(){ console.log(this); }, 0);
    } 
  }
  new Foo().foo();
}())

Если бы я не объявил строгий режим, то глобальный объект был бы напечатан на консоли (т.е. в окне).

НО, учитывая, что объявлен строгий режим, я ожидал, что undefined будет напечатано на консоли.

Ссылка:

«Это означает, среди прочего, что в браузерах больше нельзя ссылаться на объект окна через this внутри функции строгого режима».

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode#.22Securing.22_JavaScript

Обновление: для достижения ожидаемого поведения вам необходимо создать новый контекст выполнения и ссылаться на него в этом контексте следующим образом:

(function (){
  'use strict';
  function Foo() { 
    this.foo = function() { 
      setTimeout(function(){ (function() { console.log(this); }()) }, 0);
    } 
  }
  new Foo().foo();
}())

person Ben Aston    schedule 13.08.2014    source источник
comment
Он регистрирует undefined в консоли firefox и chrome....   -  person Bhojendra Rauniyar    schedule 13.08.2014
comment
потому что this при отсутствии контекста устанавливается на глобальный объект, который в браузерах равен window   -  person Patrick Evans    schedule 13.08.2014
comment
Но в строгом режиме такая ситуация предохраняется, не так ли?   -  person Ben Aston    schedule 13.08.2014
comment
Undefined - это возвращаемое значение выражения, оно печатает объект окна (Chrome 37).   -  person baldrs    schedule 13.08.2014
comment
Извините, исправление, использование setTimeout в основном запускает переданную функцию, как если бы .apply использовалось с окном stackoverflow.com/a/21957112/560593 так что у него есть контекст   -  person Patrick Evans    schedule 13.08.2014
comment
Как в строгом режиме, так и без него, результат для меня одинаков....   -  person Bhojendra Rauniyar    schedule 13.08.2014
comment
@PatrickEvans демонстрирует ли node.js такое же поведение с setTimeout?   -  person Ben Aston    schedule 13.08.2014
comment
@Ben, лично я не знаю, но, поскольку объекта окна нет, я ожидаю, что для него будет установлено что-то другое, и из комментария к связанному ответу кажется, что он установлен для объекта таймера вместо объекта окна, а в веб-воркерах — глобальный рабочий объект.   -  person Patrick Evans    schedule 13.08.2014
comment
@PatrickEvans Хорошо, спасибо. Мои тесты с Node, кажется, подтверждают.   -  person Ben Aston    schedule 13.08.2014