+ 1 ответ Йенса правильный. Однако высказывание write
обычно не должно давать вам document.write
. window
свойства действуют как глобальные, но document
свойства не:
function write(){
alert('position')
}
mybutton.onclick= function() {
write(); // this is fine!
};
Хитрость в том, что когда вы пишете встроенный атрибут обработчика события, свойства этого элемента и его предковых элементов сбрасываются в вашу область видимости. Я не уверен, что это где-то задокументировано, и, конечно, точное поведение будет отличаться в разных браузерах, но это старая, устоявшаяся и очень опасная функция:
<input onclick="alert(value);" value="A"/> // alerts A
<form method="get"><input onclick="alert(method)"/></form> // alerts get
Поскольку document
является главным предком всех узлов DOM на странице,
<div onclick="alert(write)"/> // alerts the `document.write` function
Это означает, что вы не можете ссылаться на какую-либо глобальную переменную или функцию в атрибуте встроенного обработчика событий, имя которого совпадает с именем узла-предка. А поскольку новые версии браузеров выпускаются постоянно, вводятся новые свойства DOM, любая использование любая глобальная переменная или функция в атрибуте обработчика событий, вероятно, сломается в будущем.
Это еще одна причина, по которой мы никогда не используем встроенные атрибуты обработчика событий .
[Все эти примеры предполагают, что alert
разрешается в window.alert
, то есть никто не помещал свойство alert
ни в один из узлов DOM-предков ...]