LINUX.ORG.RU

Неточности в определении замыкания в javascript

 , ,


0

1

Интересует два фрагманте кода, оба выглядят как замыкания, но согласно определению не являются замыканием. Вопрос чисто теоретический, хочу создать видеоролик про замыкание и по этому хочу точно разобраться

Определение из mdn (на английском тоже самое)

Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена. Другими словами, замыкание даёт вам доступ к Scope (en-US) внешней функции из внутренней функции. В JavaScript замыкания создаются каждый раз при создании функции, во время её создания.

Два фрагмента кода

const fn = () => {
  let x = 5;
  if (true) {
    console.log(x); // Вот тут x не существует в текущем (if-овском) скоупе, переменная ищется (lookup?) в родительском (fn-овском) 
  }
}

Вопрос, откуда берется значение переменной x? Хочется сказать и думать что из замыкания, но замыкание работает с функциями, тут же блочный скоуп

Или вот например если у нас есть файл

let x = 6;
export const getX = () => x

в данном случае переменная x не находится в скоупе внешней функции, она находится в скоупе модуля

[UPD] Так по факту и не разобрались, но большинство склоняется к тому что второй пример является замыканием, а значит на mdn была неточность.

★★★

Последнее исправление: abs (всего исправлений: 3)

Ответ на: комментарий от alysnix

можно короче:

Разве public: перед operator() можно не ставить? В общем, не важно, не для компилятора тут пишем. Главное, что смысл ясен.

monk ★★★★★
()
Ответ на: комментарий от monk

Разве public: перед operator() можно не ставить?

если класс, то надо ставить, это я забыл. а если struct - то не ставить и поле будет видно… лишний бонус так сказать. ну там подкрутить- подвертеть…

alysnix ★★★
()
Ответ на: комментарий от javascript

То же самое. Модуль это суть то же, что IIFE, ровно как и блок.

ну какая суть, я хз.

посмотри как происходит ресолв циклических зависимостей в модулях.

это тупо именованые глобальные неймспейсы, между которыми через import/export ССЫЛКИ проброшены.

и вся эта кухня разворачивается при компиляции, не в рантайме.

drsm ★★
()
Ответ на: комментарий от drsm

не в рантайме.

Какой компиляции? Вебпак? Так это немного особый случай, а модули можно подключать динамически во время выполнения кода (с вебпаком так тоже можно)

abs ★★★
() автор топика
Ответ на: комментарий от abs

Какой компиляции?

фаза компиляции, когда мы из исходников получаем, то что будем выполнять, в каком виде, не важно.

если что-то не так в этой фазе ты получаешь SyntaxError,

типа The requested module './x.js' does not provide an export named 'x'

модули можно подключать динамически

это dynamic imports, речь про статические import/export’ы.

drsm ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.