Сообщение от kostyanet
|
danik.js, нахер вообще что-то вписываете? какие-то ивенты-шмывенты.
смысла дискуссии я не уловил. Если у функции аргументы не обозначены явным образом - значит не обозначены явным образом, а this ну просто обожает появляться неявным образом, собственно как и все прочие переменные дружеского и вражеского окружения.
http://learn.javascript.ru/play/eG9lQ
|
Таки да, получается следующее:
1) если обработчик вызывается инлайново, ему надо передать this, иначе контекст будет window. Я прочёл на сайте следующее: "При создании обработчика браузером по разметке он автоматически создает функцию из его содержимого."
Если написать:
<input type="button" id="button" onclick="f()"/>
авт-ки создастся следующее:
/****что создаётся****/
document.getElementById('button').onclick = function() {
//здесь this - это button, но к f это не имеет отношения, т.к. это просто вызов левой ф-ции в обработчике
f();
}
/******/
function f () {
alert(this); //выдаст окно
}
Если же явно передать this:
<input type="button" id="button" onclick="f(this)"/>
то и вызов будет другим:
/****что создаётся****/
document.getElementById('button').onclick = function() {
//здесь this - это button, следоват-но, button и передаётся в f
f(this);
}
/******/
function f (right_this) {
alert(right_this); //выдаст button
}
Излюбленный пример danik.js показывает то же, явную передачу:
a.onclick = function() { alert(this) };
/****что создаётся****/
a.onclick = function() {
//здесь this - это button, следоват-но, button и передаётся в alert
alert(this);
}
/******/
2) если неинлайново, this передавать не надо
<input type="button" id="button">
document.getElementById('button').onclick = function() {
//здесь this - это button, и никакой обёртки не создаётся
alert(this);
}
//и никакой лев. ф-ции