2017-04-13 5 views
0

内から配列リテラルにプッシュできますか?JavaScriptでは、自己呼び出し配列リテラルにプッシュすることができます

+0

"オブジェクト内のオブジェクト"の構文が無効です。オブジェクトリテラル内の値は式にすることができますが、 '{tag:" label "id =" note_title "}'が何を意味するかは不明です。 – RobG

+0

関連:[オブジェクトリテラル宣言の自己参照](http://stackoverflow.com/q/4616202/218196) –

+0

@Felix Kling、ありがとう、私は私の質問でこれを投稿することを考えていた探していますが、特に配列リテラルに興味があります。 var foo = { a:5、 b:6、 init:function(){ this.c = this.a + this.b; これを返す。 } } .init(); – Rick

答えて

4

いいえ、できません。 Javascriptでは、items配列(あなたが "親配列"と呼ぶ)は、文字通りの宣言がインタプリタによって完全に処理されるまでローカルスコープには存在しないので、リテラル宣言内で.push()にすることはできません。

コード条件に基づいて動的に変更したい場合は、リテラル宣言が完了した後に行う必要があります。

itemsの配列を変更するメソッドをリテラル宣言で宣言できます。しかし、そのメソッドが静的宣言の途中で呼び出された場合、その定義がまだ終了していないので、itemsはまだ定義されていません。そのメソッドは、配列リテラル宣言が終了した後に呼び出される必要があります。

しかし、リテラル宣言内の自己呼び出し方式では、itemsは定義されないため、エラーが発生します。

実行して値を返す自己呼び出し式を持つことができ、その値はリテラル宣言内のいくつかのプロパティの値になります。これはちょうど普通のJavascript式であり、必要に応じて任意のリテラル宣言値を式で計算できます。 ES6では、計算されたプロパティ名を使用することもできます。しかし、parent arrayシンボルは、リテラル宣言の解析中に評価される式内からその親シンボルにアクセスすることができないように、リテラル宣言の処理が完了するまで、まだ存在しません。

は、あなたの上記のコードでは、別の方法を説明しますが、本質的に持っている:

xはあなたが宣言した大​​きなオブジェクトリテラルです
let items = x; 

itemsに何かを割り当てる前に、JavaScriptはx全体を計算します。したがって、itemsに条件付きで追加することはできませんが、xを評価しています。

+0

配列のリテラル宣言の文脈の中で、配列のスコープを明確にしてくれてありがとう、それは大きな助けになりました!私が達成しようとしていることを達成するためのより良い方法はありますか? – Rick

+0

@Arrow - 私はあなたが達成しようとしていることを本当に正確に理解していません。リテラル宣言に動的に何かを設定する通常の方法は、配列/オブジェクトを変更するか、宣言の後に呼び出すメソッドを作成できる通常のJavascriptを使用して宣言の後に代入/挿入することです。 – jfriend00

+0

私は、リテラルがインタプリタによって完全に処理された後、カスタムイベントを使ってリテラルを起動させることができました。しかし、私は "this"に対するすべての参照を未定義として失う。私はその宣言が定義されて以来、私はそのプロパティにアクセスできるだろうと思った? – Rick

関連する問題