2017-04-13 1 views
0

Pouvez-vous pousser dans un tableau littéral de l'intérieur?En JavaScript pouvez-vous pousser dans un littéral tableau auto-invoquant

+0

La syntaxe de votre "objet dans le tableau" n'est pas valide. La valeur dans un littéral d'objet peut être une expression, mais on ne sait pas très bien ce que signifie {tag: "label" id = "note_title"} '. – RobG

+0

En relation: [Auto-référence dans les déclarations littérales d'objet] (http://stackoverflow.com/q/4616202/218196) –

+0

@Felix Kling, merci, je pensais à poster ceci dans ma question car il est similaire à ce que je Je cherche, mais je suis spécifiquement intéressé par le tableau littéral. var foo = { a: 5, b: 6, init: la fonction() { this.c = this.a + this.b; retourner ceci; } } .init(); – Rick

Répondre

4

Non. Vous ne pouvez pas faire cela. En Javascript, le tableau items (que vous appelez "le tableau parent") n'existe pas dans la portée locale tant que la déclaration littérale n'est pas entièrement traitée par l'interpréteur, donc vous ne pouvez pas y entrer dans la déclaration littérale.

Si vous souhaitez le modifier dynamiquement en fonction des conditions du code, vous devez le faire après la fin de la déclaration littérale.

Vous pouvez déclarer une méthode dans la déclaration littérale qui modifiera le tableau items. Mais, si cette méthode est invoquée au milieu de la déclaration statique, alors items ne sera pas encore défini car sa définition n'est pas encore terminée. Cette méthode doit être appelée plus tard après la fin de la déclaration littérale du tableau. Mais, dans votre schéma d'auto-invocation à partir de la déclaration littérale, items ne sera pas défini, donc vous obtiendrez une erreur.

Vous pouvez avoir une expression auto-exécutable qui s'exécute et renvoie une valeur et cette valeur peut alors être la valeur de certaines propriétés dans votre déclaration littérale. C'est juste une expression Javascript régulière et toute valeur de déclaration littérale peut être calculée via une expression si vous le souhaitez. Dans ES6, vous pouvez même utiliser un nom de propriété calculé. Mais le symbole parent array n'existe pas encore tant que la déclaration littérale n'est pas traitée et que vous ne pouvez pas accéder à ce symbole parent à l'intérieur d'une expression évaluée lors de l'analyse de la déclaration littérale.

Expliqué une autre façon, dans votre code ci-dessus, vous avez essentiellement:

let items = x; 

x est un grand littéral d'objet que vous avez déclaré.

Javascript va calculer l'entier x avant d'affecter quoi que ce soit à items. Donc, vous ne pouvez pas ajouter des choses conditionnellement à items tandis que x est en cours d'évaluation.

+0

merci pour la clarification sur la portée du tableau, dans le contexte des déclarations littérales de tableau, qui a été d'une grande aide! Y a-t-il une meilleure façon de réaliser ce que j'essaie d'accomplir? – Rick

+0

@Arrow - Je ne comprends pas vraiment ce que vous essayez d'accomplir. La façon habituelle de définir dynamiquement quelque chose dans une déclaration littérale est de simplement l'assigner/l'insérer après la déclaration en utilisant le Javascript standard qui peut modifier le tableau/objet ou créer une méthode que vous appelez après la déclaration. – jfriend00

+0

J'ai été en mesure d'utiliser un événement personnalisé pour déclencher le littéral en tir après qu'il soit entièrement traité par l'interpréteur. Cependant, je perds toutes les références à "ceci" comme indéfini. Je pensais depuis que la déclaration a été définie que j'aurais accès à ses propriétés? – Rick