Ваш конкретный случай может просто быть исправлен для работы:
<script type="text/javascript">
var myButton = document.getElementById("myButton");
var myMessage = "it's working";
myButton.onclick = function() { alert(myMessage); };
</script>
Этот пример будет работать, потому что анонимная функция, созданная и назначенная обработчиком к элементу, будет иметь доступ к переменным определенным в контексте, где это было создано.
Для записи, обработчик (что Вы присваиваете посредством установки onxxx свойство) ожидает, что отдельный аргумент возьмет, который является объектом-событием, передаваемым DOM, и Вы не можете вызвать передачу другого аргумента там
То, что Вы сделали, не работает, потому что Вы связываете событие с функцией. По сути, это - событие, которое определяет параметры, которые назовут, когда событие будет сгенерировано (т.е. JavaScript не знает о Вашем параметре в функции, которую Вы связали с onclick, так ничего не может передать в него).
Вы могли сделать это однако:
<input type="button" value="Click me" id="myButton"/>
<script type="text/javascript">
var myButton = document.getElementById("myButton");
var myMessage = "it's working";
var myDelegate = function(message) {
alert(message);
}
myButton.onclick = function() {
myDelegate(myMessage);
};
</script>
Путем удаления параметра из анонимной функции будет доступно в теле.
myButton.onclick = function() { alert(myMessage); };
Для большего количества информации ищут 'закрытия JavaScript'
Обработчики событий ожидают один параметр, который является событием, которое было запущено. Вы, оказывается, переименовываете это к 'myMessage', и поэтому Вы предупреждаете объект-событие, а не Ваше сообщение.
закрытие А может позволить Вам ссылаться на переменную, которую Вы определили вне функции однако при использовании JQuery, можно хотеть посмотреть на его событие определенный API, например,
http://docs.jquery.com/Events/bind#typedatafn
, Это имеет опцию для передачи в собственных данных.
Пример:
<input type="button" value="Click me" id="myButton">
<script>
var myButton = document.getElementById("myButton");
var test = "zipzambam";
myButton.onclick = function(eventObject) {
if (!eventObject) {
eventObject = window.event;
}
if (!eventObject.target) {
eventObject.target = eventObject.srcElement;
}
alert(eventObject.target);
alert(test);
};
(function(myMessage) {
alert(myMessage);
})("Hello");
</script>
Делегаты:
function displayMessage(message, f)
{
f(message); // execute function "f" with variable "message"
}
function alerter(message)
{
alert(message);
}
function writer(message)
{
document.write(message);
}
Выполнение функции displayMessage:
function runDelegate()
{
displayMessage("Hello World!", alerter); // alert message
displayMessage("Hello World!", writer); // write message to DOM
}
То, что Вы сделали, создается новая анонимная функция, которая берет единственный параметр, который тогда присвоен локальной переменной myMessage в функции. Так как никакие аргументы на самом деле не передаются, и аргументы, которые не передаются, значение становится пустым, Ваша функция просто предупреждает (пустой указатель).
Если Вы запишете его как
myButton.onclick = function() { alert(myMessage); };
, то Это будет работать, но я не знаю, отвечает ли это на Ваши вопросы.