我在下面构建了一个嵌套对象:
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出了什么问题?
答案 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();