[英]weird behavior of nested object in javascript
我在下面構造了一個嵌套對象:
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
我的outsideMost怎么了?
注意:我不會繼續重復整個對象的文字,我將使用縮寫形式...
每次您這樣說:
{ 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
中沒有括號,因此它是對該函數的引用,而不是執行該函數。)
您忘記了指定您的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" )},
}
}
}
}
}
};
您必須這樣做:
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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.