Каковы шаги в выражениях, вызванных немедленным выражением для объектов?
Я пытаюсь понять, что происходит "под капотом". Другие вопросы не объясняют механику, которой меня это интересует. См. Код под.
Я ищу такие шаги:
(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"
p.foo = o.foo
- это выражение. Все выражения принимают значение. В этом случае это функция foo()
.
Поэтому в основном, когда вы вызываете этот код, вы не только присваиваете новое значение p.foo
(потому что так получилось, что выражение содержит оператор присваивания =
) - вы также возвращаете глобальную функцию foo
в результате оценки выражение.
Затем вы вызываете функцию inline в контексте window
, где a
равно 2.
Здесь ничего особенного не происходит.
Эта строка
(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 );
})()