В ответах на this question мы читаем, что function f() {}
определяет имя локально, а [var] f = function() {}
определяет его по всему миру. Это имеет для меня прекрасный смысл, но между этими двумя объявлениями существует какое-то странное поведение.JavaScript: Как работает функция onload() {} "отличается от" onload = function() {} "?
Я сделал страницу HTML со сценарием
onload = function() {
alert("hello");
}
, и она работала, как ожидалось. Когда я сменил его на
function onload() {
alert("hello");
}
ничего не произошло. (Firefox все еще запускал событие, но WebKit, Opera и Internet Explorer этого не делал, хотя, честно говоря, я не знаю, что правильно.)
В обоих случаях (во всех браузерах) я мог убедиться, что оба window.onload
и onload
. В обоих случаях глобальный объект this
установлен в окно, и я независимо от того, как я пишу объявление, объект window
получает свойство просто отлично.
Что здесь происходит? Почему одно заявление работает иначе, чем другое? Является ли это причудой языка JavaScript, DOM или взаимодействия между ними?
Я начинаю подозревать, что это ошибка в Webkit/Opera и что у Firefox есть правильное поведение. – Wogan
Ни один из них не является правильным. Глобальный объект (к которому относится «окно») может иметь определенные в узле свойства (такие как 'onload'), и реализация ECMAScript 3 может реализовать поведение такого свойства, которое оно считает нужным, включая внутренний' [[Put ]] ', который вызывается при назначении значения свойства. –
В Firefox 3.5.5 я вижу предупреждение, если я использую 'onload = function() {...};', но не с 'var onload = function() {...};' –