Обновить

Комментарии 11

Важным исключение является функция-конструктор. Для этого типа функций [[SCOPE]] всегда указывает на глобальный объект.

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


И во втором примере лишний вызов функции при присваивани́и.


Вцелом, для тех кто знаком с этой темой статья полезная т.к. обращает внимание на некоторые редко используемые моменты. Но освоить тему по этой статье кто совсем с темой не знаком как мне кажется будет сложно.

На мой взгляд, целевая аудитория статьи — крепкие джуны, стремящиеся к мидлу. Совсем уж джунам не стоит вникать в тонкости спецификации, им вполне достаточно для прогресса изучать основы языка.
НЛО прилетело и опубликовало эту надпись здесь
Это пример программы. Для того чтобы показать, что не все задикларированные функции(точнее не все контексты) попадают в стек, а только те, которые вызываются.

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

В примере с ReferenceType есть ошибка


const x = 0;
const obj = {
  foo: function() {
    return this.x;
  }
}
const test = obj.foo;
console.log(test());

вернёт 0 т.к. вызов test() эквивалентен вызову ГО.test(), т.е. свойство base укажет на глобальный объект, а в глобальном объекте х присвоено 0.

const не создает св-ва в глобальном объекте. Вот если объявить переменную без const, либо с var в глобальном скоупе, тогда да, будет работать

Да, там должен был быть var.

Пишите лучше на Dart. Там таких проблем нет.

дают очень туманные ответы: «this – это объект «перед точкой», который использовался для вызова метода»
Если слева от скобок активации функции находится ReferenceType, то в this функции проставляется base этого ReferenceType.
ИМХО Если не забыть упомнянуть про apply/bind/call и про логику с глобальным объектом, описание «this» в js как «объект перед точкой» в момент вызова — это самое лучшее объяснение.
var x = 0;

var obj = {
  x: 10,
  foo: function() {
   return this.x;
 }
}
console.log(obj.foo())//10

console.log([obj.foo].map(item => item() ))//0


Опишите работу второго вызова руководствуясь лишь "«this» в js как «объект перед точкой» в момент вызова — это самое лучшее объяснение.". Если получится, то снимаю перед вами шляпу.
Ну, я в моем комментарии сказал, что нужно не забыть упомянуть про логику с глобальным объектом, а именно что если код выполняется не в strict mode, то false-like this будет заменён на глобальный объект. Это то что происходит у вас во втором случае — в момент вызова перед точкой ничего нет, поэтому this=undefined и заменяется на window:
console.log([obj.foo].map(item => пустоitem() ))
Вот для понимания этих нюансов работы и была написана статья.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации