У меня есть два примера страниц, которые ведут себя по-разному, и я хотел бы знать, почему. Мне кажется, они согласуются друг с другом, основываясь на том, что я собрал в области видимости в javascript.
1.html:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
function demofunction(x, y) {
z=x+y;
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>4-6.htm</title>
</head>
<body>
<h1>Bad Scoping</h1>
<script type="text/javascript">
//<![CDATA[
demofunction(3, 2);
alert(z);
var z;
alert(z);
//]]>
</script>
<p> </p>
</body>
</html>
В этом примере демофункция запускает и устанавливает глобальную переменную z равной 5. запускается оповещение, и поскольку в области нет z, она захватывает глобальную область и находит z, равное 5, она оповещает об этом. затем определяется новая локальная переменная с именем z. второе предупреждение может видеть эту локальную переменную, но поскольку она не определена, она выбирает глобальную и снова выдает предупреждение 5.
2.html
<html lang="en">
<head>
<meta charset="utf-8">
<title>Bad Scoping</title>
<script type="text/javascript">
//<![CDATA[
first = 6;
document.writeln('<p>first is ' + first + "</p>");
function letsSee() {
alert(first);
var first;
first = 4;
}
letsSee();
document.writeln('<p>but now first is ' + first + "</p>");
//]]>
</script>
</head>
<body>
</body>
</html>
global first устанавливается на 6. выполняется,4 . Let'sSee () существует, и последний отпечаток сначала печатает глобал и снова показывает 6.
хотя этого не происходит. что происходит, когда он показывает 6, предупреждение не определено, и показывает 6. мой вопрос направлен на то, почему оно предупреждает неопределенное, а не 6? если я прокомментирую строку внутри letSee для var first;
, то я увижу, что она предупреждает 6, а затем показывает 4. Это имеет смысл для меня. но почему наличие этого var первым после оповещения влияет на то, что вызов оповещения воспринимает как значение? особенно, когда это не имело значения в 1.html.