我想知道JavaScript是否有任何功能深度限制。我问,因为我正在处理一个复杂的应用程序,不幸的是,我们无法改变数据结构。
例如,如果我尝试引用变量,例如:
Thi.sIs.An.Except.ionally[345].LongF.unct.ional[z].Refer.ence.Thats[23].Sev.eral.Lay.ers[96].Deep
我有时可以设置并获取Deep
结构及其成员的值,如果它在同一窗口中,但是如果我将此元素包含在另一个类中或尝试从另一个页面引用它并设置Deep的成员,然后深度为每个成员返回null或undefined。浏览器不会抛出错误,我只是出现意外行为。
编辑:我想添加,我试图从嵌套框架中引用Deep
,在同一个域中至少有三个级别。例如,框架需要在框架Deep
中引用Course
,从主框架向下两层,但是在需要访问它的框架的单独分支上。我们继承的应用程序使用框架,但这些框架可以更改为iframe。将这些更改为iframe也会有效吗?
parent.Topic.Course.Thi.sIs.An.Except.ionally[345].LongF.unct.ional[z].Refer.ence.Thats[23].Sev.eral.Lay.ers[96].Deep
这里有什么我想念的吗?或者是JavaScript功能深度的某种参考?
答案 0 :(得分:2)
似乎没有任何限制你可以嵌套物体的距离(或者它是否有太高的物体)。这段代码工作正常(注意我测试的是chrome):
var ctr=1, obj={};
while( ctr < 1000000 ){ // 1 million
obj = obj.obj = {}; ctr++;
};
我觉得您的问题与您尝试从“其他网页”访问此内容有关。你能发布与此相关的代码吗?
答案 1 :(得分:1)
对于依赖于特定设计实现的Javascript中的嵌套对象,应该没有固有限制。它应该取决于Javascript运行时可用的内存量。
Javascript对象具有属性。如果你有一个23级的深层次结构foo.bar.baz.quux[23].figaro.figaro.figaro...
,那么顶级对象“看到”的唯一东西就是它的直接子属性:foo
有一个属性bar
,它本身就是一个对象。 foo.bar
中包含的值不会以任何方式影响foo
。 (从foo
的角度来看,它是一个对象引用,就像C中的指针一样。)同样,对象foo.bar
有一个子属性baz
,它本身就是一个对象。 / p>
请注意,您可以在属性访问中使用循环,因此从技术上讲,可以具有无限级别的“嵌套”。这是JSDB javascript shell中的一个示例,其中对象foo
和bar
各自将另一个作为属性:
js>foo = {}
[object Object]
js>foo.foo = foo
[object Object]
js>foo.foo.foo.foo.foo
[object Object]
js>foo = {x: 1}
[object Object]
js>bar = {y: 2}
[object Object]
js>foo.bar = bar
[object Object]
js>bar.foo = foo
[object Object]
js>foo.bar.foo.bar.foo.bar.foo.bar.foo.bar.y
2
这些对象无法在JSON中序列化,因为它们具有引用周期。
如果遇到不内存问题的限制,则它不是核心语言,而是可能与浏览器中遇到的对象模型的某些方面有关。 (例如,如果对象模型以C或Java实现并暴露给Javascript,则可能在C / Java实现中存在错误或“怪癖”。)