【问题标题】:JavaScript Functional Reference Depth LimitJavaScript 函数引用深度限制
【发布时间】:2013-04-12 15:11:55
【问题描述】:

我想知道 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,在同一域上至少向下三层。例如,框架需要在框架Course 中引用Deep,在主框架的下方两层,但在需要访问它的框架的单独分支上。我们继承的应用程序使用框架,但这些可以更改为 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 功能深度的参考?

【问题讨论】:

  • @ChristianVarga 是你链接到的一个蹩脚的骗子。答案基本上是一个问题。
  • “尝试从另一个页面引用它” 另一个页面,如在弹出窗口或 Iframe 中?
  • @epascarello 该问题询问了最大嵌套级别,我的评论中的答案指出没有最大嵌套级别。如果这不是对直接问题的直接回答,我不知道是什么。
  • @epascarello - 我仍然不喜欢这个问题作为一个骗子。一个人的不受支持的评论“没有最高级别”不应该被视为所有 JS 实现的全局事实,即使它是正确的(我不知道)。我在 chrome 中对其进行了测试,它至少有 100 万,但这并不意味着无限。就这个问题而言,另一个问题基本上以“您的代码有效”关闭,没有进一步讨论,我不认为这是一个骗局。

标签: javascript


【解决方案1】:

您可以嵌套对象的距离似乎没有任何限制(或者如果有的话,它会非常高)。这段代码运行良好(注意我在 chrome 中测试过):

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

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

【讨论】:

  • 谢谢,很高兴知道变量本身不是问题。我编辑了原始问题以包含一些额外的源代码。基本上,我正在尝试从主页上几层深的框架访问Deep,而Deep 位于另一个名为Course 的嵌套框架中。
  • @KernelPanik - 您的问题几乎肯定是跨站点脚本问题。您的框架在哪些域上?不同的我猜?如果它们是不同的 TLD(例如 siteA.com 与 siteB.com),那么您就不走运了。如果它们是不同的子域(foo.siteA.com vs bar.siteA.com),您只需要在每个框架上添加一些 JS。
  • 所有站点实际上都在同一个物理服务器和同一个域上。例如框架课程是'site.com/Courses/course.html',调用框架是site.com/Courses/Engine/engine.html。我可以从引擎框架中设置课程框架中的深度,但无法获得它的值。现在,我必须为 Deep 创建一个重复的结构来实际存储它的值。此外,Deep 是一个非常大的对象的一部分。这可能是内存问题吗?
  • @KernelPanik - www.site.com vs site.com?当您遇到安全问题时,您通常只会获得 undefined 值。你是如何实现价值观的? frameName.val?你需要先点击框架的窗口对象
  • 我可以访问框架中的其他变量,以及框架名称。似乎只有框架上的深层嵌套变量存在问题。但是+1,因为我一个人不知道,我可以无限嵌套变量。
【解决方案2】:

对于依赖于特定设计实现的 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 实现中可能存在错误或“怪癖”。)

【讨论】:

  • + 1,如果我上一层,我可以访问框架Course 的变量,或者,如果我在框架@987654334 上将其变成自己的非嵌套结构,则可以访问Deep @。听起来肯定是内存问题。
猜你喜欢
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多