2017-06-14 4 views
0

Ceci est un exemple absurde utilisé uniquement à des fins d'illustration:Mise en cache d'objets anonymes Javascript

function a() { 
    return b().bar + foo.bar; 
} 

function b() { 
    var foo = { 
    bar: 'baz' 
    }; 
    return foo; 
} 

console.log(a()); // Obviously throws a Uncaught ReferenceError: foo is not defined. 

Ce que je voudrais comprendre est:

1) Est-foo résolu comme un objet anonyme (Object {bar: "baz"}) au function b avant de revenir? Ou est-il résolu en function a après foo est renvoyé? 2) Étant donné que la valeur de retour de l'appel b() est temporairement mise en cache afin d'exécuter la concaténation de chaîne, est-il possible d'accéder à cet objet anonyme pendant l'exécution, comme j'ai essayé? Eh bien, il n'est évidemment pas appelé "foo" plus, mais il est temporairement dans la portée de function a, donc la portée de la fonction sait de son emplacement, non?

Par exemple:

function a() { 
    return b().bar + b().bar; 
} 

function b() { 
    var foo = { 
    bar: 'baz' 
    }; 
    return foo; 
} 

console.log(a()); // logs "bazbaz". 

Ce qui signifie que le résultat du premier appel b() est stocké quelque part sur la pile jusqu'à ce que le deuxième on revient. Est-il possible de se référer directement à cet objet pendant l'exécution?

+3

Le nom foo n'existe que dans la portée de 'function b'. Le nom n'a aucun sens en dehors de cette fonction. –

+1

Tous les objets sont "anonymes" en JavaScript. Il n'y a pas de concept général d'un objet ayant un nom. –

+1

_Est-il possible de se référer à cet objet directement pendant l'exécution? _ 'Var foo2 = b();' autant que je sache, il pointera vers le même objet que l'objet créé dans le 'b 'function, les objets sont passés par référence dans JS. – George

Répondre

4

1) est-il résolu foo comme un objet anonyme (Object {bar: "baz"}) en fonction b avant de revenir? Ou est-il résolu dans la fonction a après foo est renvoyé?

L'identificateur foo existe uniquement dans b. Lorsque vous faites return foo, la valeur de foo est résolue, puis définie en tant que valeur de retour de b (après quoi cette valeur n'a plus aucun lien avec l'identificateur).

2) Étant donné que la valeur de retour de l'appel b() est temporairement mis en cache afin d'exécuter la concaténation de chaîne, serait-il possible d'accéder à cet objet anonyme au cours de l'exécution, comme je l'ai essayé?

Pas directement, vous auriez à stocker cette valeur quelque part afin de le réutiliser:

function a() { 
    var bval = b(); 
    return bval.bar + bval.bar; 
} 

Ce qui signifie que le résultat du premier appel b() est stocké quelque part sur la pile jusqu'à ce que la deuxième revient. Est-il possible de se référer directement à cet objet pendant l'exécution?

Non, vous ne pouvez pas accéder directement à la pile.