Помимо функций, лексическое окружение также создается при создании блоков кода, таких как блоки фигурных скобок `{}` внутри функций, условных операторов `if`, циклов `for`, а также блоков модулей `import` и `export`.
Разница между лексическим окружением, создаваемым функциями и фигурными скобками, состоит в том, что лексическое окружение функции сохраняет состояние переменных и параметров функции, а также имеет доступ к контексту выполнения функции, включая значение `this`. Лексическое окружение фигурных скобок, с другой стороны, не сохраняет состояние и доступ к контексту выполнения функции, а используется для создания временной области видимости переменных внутри блока кода.
Относительно значения `this`, обычные функции могут получить значение `this`, отличное от объекта `window`, когда они вызываются в контексте другого объекта или через методы объекта. В этих случаях значение `this` ссылается на контекст объекта, в котором функция была вызвана. Например:
```javascript
const obj = {
name: 'John',
sayHello: function() {
console.log('Hello, ' + this.name);
}
};
obj.sayHello(); // Вывод: Hello, John
```
Стрелочные функции, однако, не создают собственного значения `this` и всегда наследуют его из контекста окружения, в котором они были созданы. Это значит, что у стрелочных функций нет возможности получить значение `this`, которое отличается от значения во внешнем окружении, включая `window`.