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 または未定義を返しますそのメンバーごとに。ブラウザーはエラーをスローしません。予期しない動作が発生するだけです。

編集:追加したいのですDeepが、同じドメインで少なくとも3レベル下のネストされたフレームから参照しようとしています。たとえば、フレームは、メイン フレームから 2 層下のDeepframeCourseで参照する必要がありますが、アクセスする必要があるフレームとは別のブランチを参照する必要があります。継承したアプリケーションはフレームを使用していますが、これらは 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

1

特定の設計実装に依存する Javascript のネストされたオブジェクトに固有の制限はありません。これは、Javascript ランタイムで使用できるメモリの量に依存する必要があります。

JavaScript オブジェクトにはプロパティがあります。23 レベルの深い階層がある場合foo.bar.baz.quux[23].figaro.figaro.figaro...、最上位のオブジェクトが「見る」ものは、​​その直接の子プロパティのみです。つまり、それ自体がオブジェクトでfooあるプロパティがあります。barに含まれる値は、foo.barまったく影響fooしません。(fooの観点からは、C のポインターのようなオブジェクト参照です。) 同様に、オブジェクトには、それ自体がオブジェクトでfoo.barある子プロパティがあります。baz

プロパティへのアクセスにはサイクルを使用できるため、技術的には無限レベルの「ネスト」を使用できることに注意してください。fooオブジェクトとbarそれぞれがプロパティとして他のオブジェクトを持っているJSDB JavaScript シェルのサンプルを次に示します。

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 に答える