garka
@garka
Frontend_^_ | _^_Backend;

Поведение переменных в области глобального объекта отличается от поведения в созданных объектах?

Вопрос из разряда спортивного интереса. Тестировал в среде Node.

Суть:
  • в области глобального объекта:
this.k = {myObj:'ok'};
var k;
k = {};  // this.k == {}  => this.k и var k суть одно и то же,
         // когда находимся внутри глобального объекта (this === global)

  • а теперь то же самое в области любого другого объекта, который мы создадим из функции:

var MyObj = function(){
this.k = {myObj:'ok'};
var k;
k = {}; 
console.log(k, this.k);
}
var obj = new MyObj(); // this.k == {myObj:'ok'} => this.k и var k
                       // суть разные ячейки, когда находимся внутри созданного нами объекта obj


Собственно почему такое разное поведение? Почему в глобальной области все переменные "прилипают" к глобальному объекту как его свойства, а внутри нашего объекта var k так себя не ведет (переменная k не является свойством (this.k = undefined) даже когда мы находимся внутри функции во время ее выполнения, вот:
var z = function(){
var k; 
k ={n:'no'};
console.log(this.k);
}
var t = new z(); // => undefined undefined
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
garka
@garka Автор вопроса
Frontend_^_ | _^_Backend;
Покопал еще вопрос и нашел очень годный разбор на стаке:
stackoverflow.com/questions/4862193/difference-bet...
если коротко - переменные из нового стандарта (заданные через let, const) ведут себя порядочно, а старые варианты прилипают к глобальному объекту как свойства (0_o)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Aves
Поведение разное, потому что разные контексты исполнения. Если хочется поскрипеть мозгами, можно почитать спецификацию www.ecma-international.org/ecma-262/7.0/#sec-execu... или статьи на dmitrysoshnikov.com/category/ecmascript

Кстати переменные, объявленные в глобальном контексте через let и const в свойства глобального объекта не записываются.
Ответ написан
Комментировать
k12th
@k12th
console.log(`You're pulling my leg, right?`);
Да ни почему, родовая травма JavaScript — Брендану Эйху показалось, что это будет чудесной идеей для скриптового языка. А теперь уже поздно менять, нельзя взять и сломать половину сайтов в интернете.

Это надо знать, но пользоваться этим не стоит, и лучше сводить на минимум количество переменных, добавляемых в глобальную область видимости.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы