Sto sperando che qualcuno può spiegarmi perché il sottostante JavaScript/HTML mostrerà "porta # 2" quando il codice HTML viene visualizzato in un browser:riferimento a un valore di JavaScript prima che venga dichiarata - qualcuno può spiegare questo
<!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>
Poiché solo la dichiarazione testprint
si verifica prima window.onload
è impostato su testprint
, mi sarei aspettato window.onload
causa 'porta # 1' di presentarsi. In realtà, l'onload causa la "porta n. 2". Si noti che lo farà se la prima dichiarazione di testprint
è inclusa o meno.
La terza e quarta dichiarazione di testprint
utilizzano diversi mezzi di assegnare la funzione, ho provato questo per vedere se si sovrapporrà window.onload
s' comportamento nella stessa era il secondo dichiarazione di testprint
fa. Io non l'ho fatto. Si noti che se si sposta la quarta dichiarazione di testprint
alla fine del primo blocco di script, verrà chiamata da window.onload
.
C'è una sottigliezza per il funzionamento di sollevamento dove [i browser non sono d'accordo] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope#Conditionally_defining_a_function). _SpiderMonkey_ ** non ** elabora le funzioni dichiarate in un ambito condizionale mentre _V8_ (al momento della scrittura) lo fa. –