Question

alert(myVar1);
return false;
var myVar1;

code ci-dessus lance erreur dans IE, FF et Opera indiquant que la déclaration de retour doit venir dans la fonction. Mais cela fonctionne (spectacles undefined) dans Safari et Chrome.

Le code ci-dessus a été écrit dans le contexte global. En dehors de toutes les fonctions.

Quel est le motif?

Était-ce utile?

La solution

Dans JAVASCRIPT Les variables sont déplacés vers le haut du scénario et puis exécutez. Ainsi, lorsque vous exécutez fera

var myVar1;
alert(myVar1);
return false;

Ceci est parce que le javascript ne marche pas vraiment avoir un vrai sens de la portée lexicale. Voilà pourquoi sa meilleure pratique d'avoir toutes vos variables déclarées au sommet de la zone considérée, ils seront utilisés pour éviter un problème de levage causer. JSLint se lamenter à ce sujet.

Ceci est un bon article qui explique http: // www. adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

Le retour est invalide. Si vous voulez faire un exemple vrai de levage (prises à partir du lien ci-dessus) faire

var foo = 1; 
function bar() { 
    if (!foo) { 
        var foo = 10; 
    } 
    alert(foo); 
} 
bar();

Cette alertera 10

EDIT APRÈS UN COMMENTAIRE

Ci-dessous je crois comprendre et je l'ai lu quelque part, mais ne peut pas trouver toutes les sources que je lis donc suis ouvert à la correction.

Ce Alerts grâce aux différences de JavaScript JIT. TraceMonkey ( http://ejohn.org/blog/tracemonkey/ ) Je crois que prendra le JavaScript et faire une analyse statique rapide puis faire JIT et puis essayer de l'exécuter. Si cela échoue alors évidemment rien ne fonctionne.

V8 ne marche pas faire l'analyse statique et se déplace vers le JIT fonctionne alors si quelque chose. Son plus proche de python. Si vous exécutez le script dans la console développeur (Ctrl + Maj + j dans les fenêtres) dans Chrome, il lancera une erreur, mais aussi courir pour vous donner l'alerte.

Autres conseils

Parfois, le levage est expliqué d'une manière qui peut donner une fausse impression, à savoir les variables et les fonctions sont hissés par le moteur JavaScript comme si elles ont été déplacés physiquement sur le dessus, ce qui est en fait juste, comme le montre le code ci-dessous:

console.log(a);
var a = 'Hello World!';

Ce que nous voyons sur la console est undefined, pas 'Hello World', donc nous avons eu le comportement du code ci-dessous

var a;
console.log(a);
a = 'Hello World!';

pas le comportement de

var a = 'Hello World!';
console.log(a);

que vous pouvez obtenir l'impression de la déclaration des variables et des fonctions déplacé à la déclaration haut.

Mais JavaScript n'est pas fait le déplacement de votre code partout. Vous devez comprendre le contexte d'exécution JavaScript. Il a deux phases de phase de création et de phase d'exécution. Dans l'espace mémoire de phase de création est créée pour ces variables et les fonctions, et les gens semblent confondre cette étape avec levage. JavaScript est en fait ne se déplace pas votre partout de code, ce qui se passe est JavaScript a créé un espace de mémoire pour tout votre code à savoir les variables et les fonctions, les fonctions peuvent être placées entièrement dans la mémoire, mais en cas de variables les affectations sont traitées en phase d'exécution du contexte d'exécution. Alors, quand vous faites var a = 'Hello World!', moteur JavaScript connaît la valeur de a quand il commence à exécuter en phase d'exécution du contexte d'exécution, il met un espace réservé non défini et toutes les variables sont initialement undefined en JavaScript. Il est donc pas bon de compter sur le levage et de voir non défini. Donc, il est toujours bon de déclarer des variables et fonctions au-dessus de votre code.

Section 12.9 (page 75) de ECMA-262 Edition 3 états:

  

Un programme ECMAScript est considéré comme syntaxiquement incorrect si elle contient une instruction return qui ne sont pas dans un FunctionBody .

C'est une en dehors de return d'une fonction est une erreur de syntaxe . Si une Erreur de syntaxe Se produit, pas de code est exécuté. Pensez à votre exemple comme si vous aviez écrit:

alert(myVar1);
return false;
syntax error))))))))))))))))));

En outre, la section 16 (page 157) états:

  

Une mise en œuvre peut traiter toute instance des types d'erreurs d'exécution suivantes comme une erreur de syntaxe et donc   signaler tôt:

     
      
  • Une mauvaise utilisation de retour, pause et continuer.
  •   

moteur de Firefox et. Al. (À savoir les implémentations JavaScript qui permettent return dans la portée globale) peut est conforme, en supposant la clause suivante (dans la même section) permet la définition de la mise en œuvre de return dans la portée globale:

  

Une mise en œuvre doit faire rapport toutes les erreurs spécifiées, sauf pour ce qui suit:

     
      
  • la mise en œuvre peut fournir un type supplémentaires, des valeurs, des objets, des propriétés et des fonctions au-delà de celles qui sont décrites dans cette spécification. Cela peut provoquer des constructions (telles que la recherche une variable dans la portée globale) d'avoir un comportement défini par l'implémentation au lieu de lancer une erreur (par exemple ReferenceError ).
  •   

Ce code a peu de sens:

  • Le var myVar1 ne sera jamais RAN.
  • Le return false; ne reviendra pas une chose puisque vous n'êtes pas dans une fonction

Opera, IE et FF ont raison de lancer une erreur car ce code est vraiment pas valide puisque vous n'êtes pas en mesure de revenir à moins que vous êtes en fonction.

Si cela fonctionne dans Safari et Chrome, il doit être parce que le moteur javascript qu'ils utilisent est prêt à gérer du code bogué. Je dirais qu'ils voient le « return » et de laisser tomber ou le remplacer par une sorte de break.

Plus d'informations sur les fonctions: http://www.w3schools.com/js/js_functions. asp

Il est JavaScript chose Hisser simplement en d'autres termes, nous essayons imprimer la valeur de la variable, qui ne tient aucune valeur

Javascript va rendre le code ci-dessus: -

var myVar1
alert (myVar1)
return false

Pour clarifier plus je refered le javascript lien hissage: http: // www. ufthelp.com/2014/11/JavaScript-Hoisting.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top