J'espère que quelqu'un pourra m'expliquer pourquoi le code JavaScript/HTML ci-dessous affichera "porte # 2" lorsque le code HTML est affiché dans un navigateur:Référencer une valeur JavaScript avant qu'elle ne soit déclarée - Quelqu'un peut-il expliquer cela?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type="text/javascript">
function testprint() {
alert('door #1');
};
window.onload = testprint;
function testprint() {
alert('door #2');
};
testprint = function() {
alert('door #3');
};
</script>
<script type="text/javascript">
function testprint() {
alert('door #4');
};
</script>
</head>
<body>
</body>
</html>
Depuis que la déclaration testprint
se produit avant window.onload
est réglé sur testprint
, je me attends window.onload
cause « porte # 1 » à se manifester. En fait, onload provoque la porte n ° 2. Notez qu'il le fera si la première déclaration de testprint
est incluse ou non.
La troisième et la quatrième déclaration de testprint
utiliser différents moyens d'attribution de la fonction, j'ai essayé ceci pour voir si elle l'emporterait sur le comportement de window.onload
dans le même était la deuxième déclaration de testprint
fait. Il n'a pas. Notez que si je déplace la quatrième déclaration de testprint
à la fin du premier bloc de script, elle sera appelée par window.onload
.
Il y a une subtilité à la fonction de levage où [les navigateurs ne sont pas d'accord] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope#Conditionally_defining_a_function). _SpiderMonkey_ ** ** ne va pas lever les fonctions déclarées dans une portée conditionnelle alors que _V8_ (au moment de l'écriture) le fait. –