0

我想知道 JavaScript 是否有任何功能深度限制。我问是因为我正在处理一个复杂的应用程序,不幸的是,我们无法更改数据结构。

例如,如果我尝试引用一个变量,例如:

Thi.sIs.An.Except.ionally[345].LongF.unct.ional[z].Refer.ence.Thats[23].Sev.eral.Lay.ers[96].Deep

我有时可以设置和获取Deep结构及其成员的值(如果它在同一个窗口中),但如果我将此元素包含在另一个类中或尝试从另一个页面引用它并设置 Deep 的成员,那么 deep 稍后会返回 null 或 undefined为其每个成员。浏览器不会抛出错误,我只是得到意外的行为。

编辑:我想补充一点,我试图Deep从嵌套框架中引用同一域上至少三个级别。例如,框架需要Deep在 frame中引用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 功能深度的参考?

4

2 回答 2

2

您可以嵌套对象的距离似乎没有任何限制(或者如果它非常高)。此代码工作正常(注意我测试这是在 chrome 中):

var ctr=1, obj={};
while( ctr < 1000000 ){ // 1 million
    obj = obj.obj = {}; ctr++;
};

我感觉您的问题与您尝试“从另一个页面”访问此内容有关。您可以发布与此相关的代码吗?

于 2013-04-12T15:22:43.163 回答
1

Javascript 中的嵌套对象不应该有固有的限制,这取决于特定的设计实现。它应该取决于 Javascript 运行时可用的内存量。

Javascript 对象具有属性。如果你有一个 23 级的深层次结构foo.bar.baz.quux[23].figaro.figaro.figaro...,那么顶层对象“看到”的唯一东西就是它的直接子属性:foo有一个属性bar,它本身就是一个对象。中包含的值foo.bar不会foo以任何方式产生影响。(从foo的角度来看,它是一个对象引用,就像 C 中的指针。)类似地,对象foo.bar有一个子属性baz,它本身就是一个对象。

请注意,您可以在属性访问中有循环,因此从技术上讲,您可以拥有无​​限级别的“嵌套”。这是 JSDB javascript shell 中的一个示例,其中对象foobar每个对象都有另一个作为属性:

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 实现中可能存在错误或“怪癖”。)

于 2013-04-12T15:47:37.690 回答