Pull to refresh

Comments 11

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

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


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


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

На мой взгляд, целевая аудитория статьи — крепкие джуны, стремящиеся к мидлу. Совсем уж джунам не стоит вникать в тонкости спецификации, им вполне достаточно для прогресса изучать основы языка.
UFO just landed and posted this here
Это пример программы. Для того чтобы показать, что не все задикларированные функции(точнее не все контексты) попадают в стек, а только те, которые вызываются.

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

В примере с 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 в глобальном скоупе, тогда да, будет работать

дают очень туманные ответы: «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() ))
Вот для понимания этих нюансов работы и была написана статья.
Sign up to leave a comment.

Articles