Примечание: я не собираюсь повторять весь объектный литерал, я просто буду использовать сокращенную форму ...
Каждый раз, когда вы говорите это:
{ innerCall: alert( "i'm the call from inner1" ) }
Вы не создавали свойство innerCall
, которое было функцией alert()
, вы создавали свойство innerCall
, которому был присвоен результат фактического вызова функции alert()
в тот момент.Возвращаемое значение alert()
равно undefined
.
. Таким образом, вложенная структура с пятью уровнями глубины называется alert()
пять раз в процессе создания объекта, но фактические свойства innerCall
были установлены наundefined
.Итак, вот что:
outerMost.inner1.inner2.inner3.inner4.innerCall();
Это как сказать undefined();
- что, конечно, не работает.
Вам нужно, чтобы innerCall
ссылался на функцию, которая в свою очередь вызываетalert()
:
{ innerCall : function() { alert("I'm the call from inner1"); } }
Это более или менее эквивалентно выполнению этого:
function myInnerCallFunction1() {
alert("I'm the call from inner1");
}
{ innerCall : myInnerCallFunction1 }
(Обратите внимание, что в литерале объекта myInnerCallFunction1
нет круглых скобок, поэтому этоссылка на функцию, а не на выполнение функции.)