02.08.2008

Элементы с id порождают глобальные переменные в JS

Для всех элементов с атрибутом id в джавасрипте создается глобальная переменная. Следующий пример во всех браузерах выдаст алерт с "DIV".

<html>
<head>
    <script>
        window.onload = function () {
            alert(myDiv.tagName);
        };
    </script>
</head>
<body>
    <div id="myDiv">test</div>
</body>
</html>

Это плохо, но в принципе не страшно, если вы:

  • Избегаете создавать свои глобальные переменные.
  • Не забываете объявлять свои переменные. Если вы забыли объявить переменную (var myVar), то джавасрипт считает, что это глобальная переменная (implied global variable).

7 комментариев:

shabunc комментирует...

да что вы )
попробуйте ввести в файрбаге

$$('*').filter(function($1){return $1.hasAttribute('id')}).map(function($1){
console.log(window[$1.id]);
})

Stepan комментирует...

Как вы объясните тогда поведение моего примера?

Shabunc комментирует...

я не знаю, может быть тем, что вы не проверили в Файрфоксе ))))

Shabunc комментирует...

подсказка - quirksmode )

Stepan комментирует...

Да, действительно, с включением доктайпа мой пример перестал работать в Файрфоксе, однако продолжает работать в IE, Opera и Safari.

Спасибо вам за информацию, я не знал что это может зависить от доктайпа.

Shabunc комментирует...

да не за что, Степан, вам спасибо, что пишете

denisxru комментирует...

Стёпа - ты лучший! :)