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?
Le nom foo n'existe que dans la portée de 'function b'. Le nom n'a aucun sens en dehors de cette fonction. –
Tous les objets sont "anonymes" en JavaScript. Il n'y a pas de concept général d'un objet ayant un nom. –
_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