Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Важным исключение является функция-конструктор. Для этого типа функций [[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 в глобальном скоупе, тогда да, будет работать
Пишите лучше на 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 и ScopeChain в EcmaScript