Le programme JS suivant a un comportement bizarre sous V8. J'aurais cru que "foo" est une variable dont on peut changer la valeur, après tout V8 ne donne pas d'erreur lorsqu'on fait "foo=123;" et pourtant print(foo) juste après donne la définition de fonction foo!
Est-ce que ça respecte ES5?
Marc
var foo = 999;
function run(thunk) { thunk(); }
function main() { print(foo); run(function foo() { print(foo); foo=123; print(foo); }); }
main();
/* V8 prints:
999 function foo() { print(foo); foo=123; print(foo); } function foo() { print(foo); foo=123; print(foo); }
*/
Afficher les réponses par date
On 2011-11-02, at 10:32 PM, Marc Feeley wrote:
Le programme JS suivant a un comportement bizarre sous V8. J'aurais cru que "foo" est une variable dont on peut changer la valeur, après tout V8 ne donne pas d'erreur lorsqu'on fait "foo=123;" et pourtant print(foo) juste après donne la définition de fonction foo!
Est-ce que ça respecte ES5?
À moins que je ne fasse erreur, une déclaration de fonction crée un "immutable binding" qui, d'après la spec, ne peut faire l'objet d'une affection. Donc, foo=123 utilise le binding sur le l'objet global plutôt que le binding local. Si tu déclares foo en utilisant "var foo = fonction () ...", tu obtiens le comportement attendu.
Bruno