Лексическое окружение, контекст вызова. Почему это разные понятия?
Лекс. окружение – это переменные, которые определены и "видны" функции.
Контекст – это this.function outer() {
  var a = 1; // переменная в лексическом окружении ф-ии inner()
             // внутри inner() можно использовать значение a
  return function inner() {
    console.log("a == ", a, "this == ", this);
  }
}

var f1 = outer(); // f1 - функция
f1(); // a == 1, this == window или self

var f2 = f1.bind({title: "Ololo"}); // f2 - новая функция
f2(); // a == 1, this.title == "Ololo"
// лексическое окружение это все переменные
// которые доступны в момент создания функции
const lexEnv = 42
const lexEnv2 = 32
const lexEnv3 = 16
const lexEnv4 = 4

// создаём функцию
function fn() {
  console.log([
    lexEnv, // эта переменная взята из окружения
    this,
    this.field + lexEnv
  ])
}

const obj1 = {
  field: 8,
  myFn: fn
}

obj1.myFn() // здесь this становится равен obj1, this.field === 8


// пример другого this
let obj2 = {
  field: 100
}
obj2.myFn2 = obj1.myFn
// если мы использовать функцию как метод другого объекта
obj2.myFn2() // здесь this становится равен obj2, this.field === 100