6
if(true) { 
    let m = "yo"; 

    console.log(m); 
} 

console.log(m) 

Sortie:Ordre d'exécution JavaScript: pourquoi ce conditionnel s'exécute-t-il après le code qui le suit?

ReferenceError: m is not defined 
yo 

Ainsi, le code sur la ligne 4 est en cours d'exécution après le code sur la ligne 8.

Mon utilisation de let ont rien à voir avec cela?

EDIT: Après avoir lu les commentaires, j'ai réalisé que cela pouvait être dû à mon temps d'exécution. Voici comment je le vois dans Firefox nuit:

firefox nightly let m

EDIT 2: Si tel est juste mon temps d'exécution, alors y at-il des implications pour le code de production en raison de quelque chose comme ça? Comportement incohérent entre les navigateurs? Comment puis-je me prémunir contre cela?

+0

Vous l'utilisez dans Chrome? – Ben

+1

[Je ne peux pas reproduire cela.] (Http://jsfiddle.net/nxzt5npp/) - et je regarde cela dans l'édition de développement FF. – Andy

+0

J'ai ce comportement dans Firefox Nightly, console. –

Répondre

2

Donc je pense que le comportement de l'exécution FF est OK. Un coup d'œil rapide à la spécification (6.2.3.1 etc) indique que le code doit s'exécuter ligne par ligne, jusqu'à la seconde console.log(m) à quel point un ReferenceError est lancé.

Je soupçonne que cela "semble drôle" en raison de l'ordre dans lequel la console choisit de rendre le premier console.log et le message d'exception (c'est l'inverse de Chrome par exemple). Si l'ordre de rendu à la console est considéré comme un bug ou pas, je laisse à d'autres.

Ce qui suit apparaît pour confirmer mon analyse avec l'alerte affichée avant que l'exception ne soit enregistrée.

if(true) { 
    let m = "yo"; 

    alert(m); 
} 

console.log(m) 
+0

Pourriez-vous confirmer qu'il s'agit d'un bug? Je n'ai pas les connaissances pour déduire ce que vous dites [je trouve vraiment difficile à saisir :-)]. Peut-être que je devrais déposer un rapport? –

+0

Je vais devoir vérifier les erreurs de référence re spec – Ben

+2

@adityamenon Lançant l'erreur de référence * early * et n'exécutant pas le 'if' et' console.log' du tout * aurait * été un bug. Le code semble s'exécuter correctement, que le journal est imprimé après que l'erreur est confuse mais pourrait être couverte par l'implémentation de l'objet 'console'. Oui, vous devriez déposer un bogue car ce comportement est assez inattendu, mais pas avec la conformité ES6 mais plutôt avec le composant devtools. (Et après que vous l'avez fait, s'il vous plaît le lier ici) – Bergi