嵌套对象在javascript中的奇怪行为

时间:2011-12-07 10:01:29

标签: javascript object

我在下面构建了一个嵌套对象:

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" ),

                    }
                }
            }
        }
    }
};

我想要的是通过使用以下内容来听取内部呼叫形式:

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

但是我收到了每个内部警报的调用,并且抛出了一条指向调试器中最后一个表达式的错误消息:

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

我的outerMost出了什么问题?

3 个答案:

答案 0 :(得分:1)

注意:我不会继续重复你的整个对象文字,我只会使用缩写形式......

每次你这样说:

{ 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中没有括号,所以它是对函数的引用而不是执行函数。)

答案 1 :(得分:0)

您忘了指定您的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" )},

                    }
                }
            }
        }
    }
};

答案 2 :(得分:0)

你必须这样做:

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();