Галоўная > Разбор пытанняў з рэальных сумоўяў JS. Практыка

Разбор пытанняў з рэальных сумоўяў JS. Практыка

сумоўе
js

Пытанне:

Што убачым у кансолі?

function A() {
  console.log(this);
}

var B = A.bind({o:'object1'});

// 1 выклік
B();

// 2 выклік
B.call({a: 'object2'});

// 3 выклік
new B();

Кароткі адказ:

{o:'object1'}
{o:'object1'}
{}

Падрабязны адказ:

З першым аб'ектам зразумела - прывязваем кантэкст з дапамогай bind, ён і будзе this пры першым выкліке B.

Пры другім выкліке з дапамогай call спрабуем змяніць кантэкст (this). Але кантэкст да функцыі можна прывязаць толькі адзін раз. Усе іншыя спробы будуць ігнаравацца. Таму функцыя выклікаецца, але кантэкст застанецца папярэднім.

Апошні выпадак самы цікавы. Функцыю з прывязаным кантэкстам выклікаем як канструктар. Тут трэба ведаць, што адбываецца пры выкліканні функцыі, як канструктара.

  • Ствараецца новы пусты аб'ект, ён прысваіваецца this
  • Выконваецца код функцыі, у аб'ект дадаюцца новыя ўласцівасці
  • Вяртаецца значэнне this (return у функцыях-канструктарах пісаць не трэба).
function A() { // this = {}
  this.prop = 'Prop'  // this = { prop: 'Prop' }
}

new A()

Такім чынам становіцца зразумела, што прывязка кантэксту да функцыі-канструктара ніякай ролі не мае. Так як у целе функцыі няма ніякіх уласцівасцей, то вяртаецца пусты аб'ект.

loveJS, 2023-06-01
Каментары

    (Каб даслаць каментар залагуйцеся ў свой уліковы запіс)

    ;