Каковы шаги в выражениях, вызванных немедленным выражением для объектов?

107
12

Я пытаюсь понять, что происходит "под капотом". Другие вопросы не объясняют механику, которой меня это интересует. См. Код под.

Я ищу такие шаги:

(p.foo = o.foo)(); expresion Значение o.foo находится где-то и еще не связано с p obj? Значение o.foo выполнено? p.foo получает значение на o.foo?

это правильно? если да, то на этапе 2 нужно больше информации о том, как, где и почему...

function foo() {
console.log( this.a );
}

var a = 2;
var o = { a: 3, foo: foo };
var p = { a: 4 };

o.foo(); // 3
(p.foo = o.foo)(); // we get 2 and not 4"

спросил(а) 2018-04-22T19:50:00+03:00 2 года, 5 месяцев назад
1
Решение
107

p.foo = o.foo - это выражение. Все выражения принимают значение. В этом случае это функция foo().

Поэтому в основном, когда вы вызываете этот код, вы не только присваиваете новое значение p.foo (потому что так получилось, что выражение содержит оператор присваивания =) - вы также возвращаете глобальную функцию foo в результате оценки выражение.

Затем вы вызываете функцию inline в контексте window, где a равно 2.

ответил(а) 2018-04-22T20:19:00+03:00 2 года, 5 месяцев назад
40

Здесь ничего особенного не происходит.

Эта строка

(p.foo = o.foo)();

эквивалентно выполнению функции ниже в глобальной области (это относится к окну), где значение a равно 2, которое печатается.

    function foo() {
console.log( this.a );
}

следующее назначение возвращает определение функции

p.foo = o.foo 

его не выполняет foo на p или o объект. просто добавив свойство foo на объект p и назначив ему эту функцию.

Следовательно, вы в конечном итоге выполняете код в глобальной области

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

ответил(а) 2018-04-22T20:14:00+03:00 2 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема