В javascript, если функции являются объектами 1-го класса. Тогда где переменные, которые закрываются над этой функцией, хранятся в кучах или стеке? - PullRequest
0 голосов
/ 08 апреля 2020

Я ссылаюсь на ответ из переполнения стека - >> V8 использует кучу, аналогичную JVM и большинству других языков. Это, однако, означает, что локальные переменные (как правило) помещаются в стек, а объекты - в кучу. Это может, например, не выполняться, если функция закрывает эти значения. Как и в JVM, примитивы могут храниться в стеке только в том случае, если они хранятся в локальной переменной.

Как пользователь, это не то, о чем вам обычно нужно беспокоиться.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

(здесь разработчик V8.) Вы правы, локальные переменные в одной функции, которые закрывает другая функция, не могут быть легко сохранены в стеке. В частности, в V8 они хранятся в так называемом объекте «Контекст» в куче, о котором говорит @JonasWilms. Чтобы проиллюстрировать это на примере:

function outer() {
  let a = 1;  // Will be on the stack
  let b = 2;  // Will be in the context on the heap
  return function inner() {
    return b;
  }
}

Вы также абсолютно правы, что вам не о чем беспокоиться :-) В частности, потому что "стек" и "куча" действительно являются внутренними деталями реализации; именно так получилось, что это наиболее распространенный способ достижения движками (для многих языков) требуемого поведения с достойной производительностью.

Говоря более концептуально, мы говорим об объемах и временах жизни переменных здесь: в примере a выходит из области видимости (= становится недоступным), когда outer завершает работу, тогда как b - это по-прежнему достижимы через inner, поэтому он длится до тех пор, пока inner не может быть вызван снова. То, как двигатель выполняет это, является внутренней деталью и может измениться в любое время. Например, механизм может решить упростить свою реализацию, всегда помещая все переменные в кучу, избегая необходимости заранее анализировать, какие переменные будут закрыты, а какие нет. Все, что имеет значение, это наблюдаемое поведение, а не то, как оно достигается под капотом.

0 голосов
/ 08 апреля 2020

Если вы посмотрите на v8 do c, вы увидите, что функции имеют атрибут Local<Context>. Local - это класс-оболочка для значений, управляемых сборщиком garbagge, так что да, Context находится в куче.

...