странное поведение вложенного объекта в JavaScript - PullRequest
1 голос
/ 07 декабря 2011

я построил вложенный объект ниже:

var outerMost = {

    inner1: {

    innerCall: alert( "i'm the call from inner1" ),

        inner2: {

        innerCall: alert( "i'm the call from inner2" ),

            inner3: {

            innerCall: alert( "i'm the call from inner3" ),

                inner4: {

                innerCall: alert( "i'm the call from inner4" ),

                    inner5: {

                    innerCall: alert( "i'm the call from inner5" ),

                    }
                }
            }
        }
    }
};

Все, что я хочу - это услышать форму вызова inner4, используя это:

outerMost.inner1.inner2.inner3.inner4.innerCall();

Но я получаю звонки от каждого внутреннего оповещенияи было выдано сообщение об ошибке, указывающее на последнее выражение от отладчика:

Property 'innerCall' of object #<Object> is not a function

Что не так с моим externalMost?

Ответы [ 3 ]

1 голос
/ 07 декабря 2011

Примечание: я не собираюсь повторять весь объектный литерал, я просто буду использовать сокращенную форму ...

Каждый раз, когда вы говорите это:

{ 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 нет круглых скобок, поэтому этоссылка на функцию, а не на выполнение функции.)

0 голосов
/ 07 декабря 2011

Вы должны сделать это так:

var outerMost = {

inner1: {

    innerCall: function () {
        alert("i'm the call from inner1")
    },

    inner2: {

        innerCall: function () {
            alert("i'm the call from inner2")
        },

        inner3: {

            innerCall: function () {
                alert("i'm the call from inner3")
            },

            inner4: {

                innerCall: function () {
                    alert("i'm the call from inner4")
                },

                inner5: {

                    innerCall: function () {
                        alert("i'm the call from inner1")
                    },

                }
            }
        }
    }
}
};
outerMost.inner1.inner2.inner3.inner4.innerCall();
0 голосов
/ 07 декабря 2011

Вы забыли указать, что ваши объекты innerCalls являются функциями ... Правильный код ниже

var outerMost = {

    inner1: {

    innerCall: function() {alert( "i'm the call from inner1" )},

        inner2: {

        innerCall: function() {alert( "i'm the call from inner2" )},

            inner3: {

            innerCall: function() {alert( "i'm the call from inner3" )},

                inner4: {

                innerCall: function() {alert( "i'm the call from inner4" )},

                    inner5: {

                    innerCall: function() {alert( "i'm the call from inner5" )},

                    }
                }
            }
        }
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...