Comments 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
в глобальном скоупе, тогда да, будет работать
Пишите лучше на 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() ))
console.log([obj.foo].map(item =>
Sign up to leave a comment.
this и ScopeChain в EcmaScript