Замыкание и область видимости
Лексическое окружение
При запуске функции создаётся объект LexicalEnvironment
, в который записываются аргументы, функции и переменные, определённяе внутри этой самой функции.
function fn(prop) {
// [[LexicalEnvironment]] = { prop, something }
var something = 'something';
}
При доступе к переменной, сначала она ищется в LexicalEnvironment
, а затем во внешнем окружении через скрытое свойство [[Scope]]
, которое ссылается на лексическое окружение, в котором была создана функция.
fn.[[Scope]] = LexicalEnvironment текущего запуска fn
Замыкание (closure) — это функция + внешние переменные. Другими словами: LexicalEnvironment
+ [[Scope]]
.
Примечание: в Chrome Dev Tools, у функций можно обнаружить свойство [[Scopes]]
которое содержит массив с цепочкой Scope до глобальной.
Исключение
При создании функции с использованием new Function
, её свойство [[Scope]]
ссылается не на текущий LexicalEnvironment
, а на глобальный (window).
const a = 1;
function fn() {
const a = 2;
return new Function('', 'alert(a)');
}
fn()(); // => 1