Comments 11
В чём практическая ценность этой статьи?
Показать, что как выглядит в отладчике? А не проще просто открыть отладчик и увидеть?
Конечно проще. Если знать на что смотреть. А в чём практическая ценность вашего вопроса?
Если знать на что смотреть.
А это не очевидно что ли? Если не разворачивается — значит примитив. Если разворачивается — значит объект, причём у него и конструктор подписан.
Для того, кто знает JavaScript — представление переменных в отладчике не окажется чем-то новым даже отладчик открыт первый раз. Там всё нарисовано так же, как оно доступно из кода.
А в чём практическая ценность вашего вопроса?
Очевидно, в том, чтобы получить на него ответ. О чём Вы хотели написать-то?
Вот видите, вы выделяете всего 2 сущности в исходном коде — объект и примитив (причём Symbol, являясь примитивом, в отладчике IDEA имеет признак разворачиваемого), а я выделяю 8 сущностей. Плюс, у анонимных классов конструктор не подписан, а модули, хоть и разворачиваются, конструкторов не имеют в принципе. И если бы вы читали не только заголовок, но и резюме, то там я специально для Вас написал:
Не знаю, увидели ли вы что-либо новое для себя в этой статье (если нет, то надеюсь, вы хотя бы не читали её внимательно, надеясь найти что-то новое), зато я обнаружил для себя много чего незнакомого, пока её писал. Что уже хорошо, пусть и не в масштабах Вселенной.
имеет признак разворачиваемого
Но не разворачивается же.
а я выделяю 8 сущностей
Которые различаются тем, что у них внутри. Либо не различаются.
Моя классификация — двухуровневая.
у анонимных классов конструктор не подписан
Специально проверил. Если развернуть, то у прототипа есть свойство constructor, как у всех.
Вообще не вижу причины как-то особо выделять классы — под капотом те же конструктор и прототип.
Не знаю, увидели ли вы что-либо новое для себя в этой статье
Даже человек, для которого новая вся статья, узнал бы то же самое и без неё, просто открыв отладчик и 20 минут с ним поигравшись.
Развивайте дальше вашу мысль. Что вы хотите донести своими комментами? Мне уже даже интересно.
Я по-прежнему пытаюсь понять генеральную мысль статьи.
Не могу поверить, что Вы просто описали то, что легко увидеть и без Вас. Очевидно, у Вас была цель сказать читателю что-то неочевидное. А я почему-то в упор ничего такого не вижу. Может, не туда смотрю?
Очевидно, что человек, различающий всего два цвета, не сможет понять описание радуги, сделанное человеком, различающим 7 цветов (в нашем случае — 8). Попробую объяснить.
Если не разворачивается — значит примитив. Если разворачивается — значит объект, причём у него и конструктор подписан.
Вот здесь sub
— это примитив или объект?
Если примитив, то почему разворачивается, если объект, то где у него конструктор?
Похоже, что в моей классификации типов сущностей исходного кода пропущено замыкание (closure). Я ошибочно относил замыкание к областям видимости (scopes), но, переспав с этой мыслью, я всё-таки вынес замыкание в отдельный тип.
{
function outer() {
let nameOut = 'outer';
return function middle() {
let nameMid = 'middle';
return function inner() {
let nameIn = 'inner';
debugger; // breakpoint 2
return `${nameOut}/${nameMid}/${nameIn}`;
};
};
}
const func = outer()();
debugger; // breakpoint 1
func();
}
В первой точке останова у нас, путём запуска "outer()()"
определена функция "func"
, что приводит к созданию двух замыканий:
Я вынес замыкания в отдельный тип, т.к. они создаются в момент определения функции, а не в момент её запуска. В момент запуска замыкания превращаются в области видимости (вторая точка останова):
В общем, т.к. в отладчике "замыкания" и "области видимости" показываются по-разному (и искать их при отладке нужно в разных местах), я также их различаю. Таким образом в моей классификации на данный момент 9 типов сущностей, которые можно обнаружить в исходном коде. Из них 8 видны через отладчик (пакеты в nodejs видны как модули, а в браузере вообще отсутствуют).
пакеты в nodejs видны как модули
cjs — как объекты. Можно даже получить конструктор и вызвать его с new
Javascript: исходный код и его отображение при отладке