Локальная глобальная область видимости

Всю неделю готовлю сразу две статьи, первая о comet (постоянное соединение с сервером) и вторая о ранжированном поиске который наконец таки заработал на сайте но на этот раз будет махонькая заметка о корректной работе браузеров.

Все учебники по JavaScript наперебой рассказывают о присвоении значений переменным, и об области их видимости. Сейчас мы на примере рассмотрим, что хотя то что они говорят и есть правильно но не всегда работает. Итак, в глобальной области видимости мы проверим чему у нас равен указатель this, а заодно создадим функцию в любой области видимости главное, чтоб ее можно было вызвать.


alert(this === window);

var func = function(){
	alert("hello from onload!");
};

Как и следовало ожидать мы находимся в глобальной области видимости и this у нас равен (и того же типа что и) window, то есть объявляя какую-либо переменную мы можем не указывать ключевое слово var.


onload = function (){
	func();
}

В результате работы этого скрипта мы получим наш алерт, потому что событие window.onload срабатывает когда страница полностью загружена.

Вам еще не надоело перечитывать материалы учебника для ламеров? Ну ладно начинается вкусненькое!

Создадим переменную в локальной области видимости, поскольку локальная у нас глобальна (во загнул!), то мы собственно еще раз попытаемся присвоить значение событию window.onload.


var onload = function (){
	func();
}

Вот тут и начинаются косяки, работает это только в FireFox, а Opera и IE начисто игнорируют нашу писанину! Листаем учебник дальше и видим что определение функции с именем эквивалентно определению переменной с тем же именем в локальной области видимости.


function onload (){
	func();
}

И что бы вы думали?! Действительно абсолютно эквивалентно, потому что оно также не работает, как и прошлый пример. Вы можете сказать, что я где-то что-то мухлюю и во втором и третьем примере переменные не попадают в объект window, но для всех трех примеров и всех трех браузеров алерт выдает один и тот же результат.


alert(window.onload);

Из всего вышесказанного можно сделать два вывода, даже три: Первый и самый главный — FireFox снова на высоте! Второй заключается в том, что для Opera и IE локальная область видимости скрипта не такая уже и глобальная, как хотелось бы. Ну и третий маловероятный, что все учебники врут.