ru.javascript.info icon indicating copy to clipboard operation
ru.javascript.info copied to clipboard

Обновление движка V8, нужны изменения в статье "Замыкание"

Open k0ct9lHbl4 opened this issue 2 years ago • 1 comments

Соавтор нахождения и объяснения причины особенностей движка: @mirageN1349 Пример с особенностью движка в конце статьи теперь не работает (https://learn.javascript.ru/closure) image

Теперь, если в лексическом окружении не используется переменная, то движок её не видит Примеры:

  1. Здесь мы не используем переменную value1 в локальном лексическом окружении, связанном с функцией f, и движок её не видит
let value = "Сюрприз!";

function f() {
  let value1 = "значение1";
  let value = "ближайшее значение";

  function g() {
    console.log(value)
    // alert(value1) в консоли НЕ выведет "значение1"
    debugger; 
  }

  return g;
}

let g = f();
g();

image

  1. Теперь мы используем переменную value1 в локальном лексическом окружении, связанном с функцией f, и движок её видит
let value = "Сюрприз!";

function f() {
  let value1 = "значение1";
  let value = "ближайшее значение";
  
  function g1() {
    console.log(value1)
  }

  function g() {
    console.log(value)
    // alert(value1) в консоли выведет "значение1"
    debugger; 
  }

  return g;
}

let g = f();
g();

image


По поводу примера из статьи: в safari, даже когда значение не используется, движок корректно сохраняет свойство лексического окружения (переменную) image

k0ct9lHbl4 avatar Mar 03 '23 22:03 k0ct9lHbl4

Это не "теперь", а уже несколько лет как. V8 здесь не отслеживает судьбу созданных функций (в частности, пофиг что функция g1 из последнего примера поедет сразу в GC). Всё просто: упоминается переменная - пожалуйста в общее замыкание (в примере - общее для функций g и g1).

В статью можно добавить, что eval('...') добавляет в замыкание все переменные, без разницы, упоминаются они или нет.

alexandroppolus avatar Apr 05 '23 16:04 alexandroppolus