Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
k0ct9lHbl4 opened this issue Mar 3, 2023 · 1 comment

Comments

@k0ct9lHbl4
Copy link

k0ct9lHbl4 commented Mar 3, 2023

Соавтор нахождения и объяснения причины особенностей движка: @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

@alexandroppolus
Copy link

alexandroppolus commented Apr 5, 2023

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants