Espero que alguien me explique por qué el siguiente JavaScript/HTML mostrará "puerta # 2" cuando el HTML se visualiza en un navegador:Hacer referencia a un valor de JavaScript antes de que se declare - ¿Alguien puede explicar esto?
<!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>
Puesto que sólo la declaración testprint
ocurre antes window.onload
se establece en testprint
, yo esperaría window.onload
causa 'puerta # 1' en aparecer. En realidad, onload causa 'puerta # 2'. Tenga en cuenta que hará esto si se incluye o no la primera declaración de testprint
.
La tercera y cuarta declaración de testprint
utilizar diferentes medios de asignación de la función, he intentado esto para ver si sería anular window.onload
's comportamiento de la misma era la segunda declaración de testprint
hace. No lo hizo. Tenga en cuenta que si muevo la cuarta declaración de testprint
al final del primer bloque de scripts, se llamaría por window.onload
.
Hay una sutileza para la función de elevación donde [los navegadores no están de acuerdo] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope#Conditionally_defining_a_function). _SpiderMonkey_ ** no ** levantará las funciones declaradas en un alcance condicional, mientras que _V8_ (en el momento de escribir esto) lo hará. –