Почему возвращает window?
в чем тут логика?
Да ни в чём. Один из подводных камней языка. Типа, контекст должен всегда быть объектом, а для null/undefined, в отличие от строк/чисел/bool нет объектных обёрток, поэтому вот такой костыль. В строгом режиме работает как надо:(function() {
  'use strict';
  var func = function() { console.log(this); };
  func.call(null); // выведет null
})();
Значение this при вызове без контекста