buenas,
la explicacion de este concepto es que
los eventos definido como atributo tienen un scope o contexto mas complejo a diferencia de lo que se puediera considerar un codigo regular de javascript. por eso, como bien cita panino5001,
es posible acceder a cualquier propiedad del elemento sin una referencia explícita. lo que sucede es algo similar a la resolucion de variables en los scopes de las funciones. basicamente, lo que hace el interprete es determinar si dicho token o identificador existe en el scope donde esta definido el evento y luego continua la busqueda en un scope mas alto en la jerarquia hasta encontrar dicho identificador, ya sea como propiedad o variable. en el ejemplo de panino5001,
type primero es buscado en el contexto de la funcion, luego en el objeto Element de <input>. es aqui donde termina la busqueda porque en dicho objeto existe la propiedad
type. usando ligeramente el ejemplo de panino para señalar lo anterior.
Código:
// type en el contexto de <input> ;
<input type="button" name="bt" onclick="alert(type)">
// igual que el anterior ;
<input type="button" name="bt" onclick="type = true; alert(type)">
// type en el contexto de la funcion ;
<input type="button" name="bt" onclick="var type = true; alert(type)">
notese el segundo y tercer input. el segundo input parece declarar la variable
type, pero en realidad no se esta creando. lo que hace es buscar la variable o propiedad
type de cualquier contexto y le asigna el valor
true. si no se encuentra
type en ningun scope, se hubiera creado una variable global. en este caso, esta modificando la propiedad
type de <input> convirtiendo asi el elemento a tipo text. de modo que el alert mostrara
text. el tercer ejemplo es distinto porque esta declarando explicitamente una variable en el contexto de la funcion.
en conclusion, algo similar es lo que sucede con
form en el ejemplo original del autor.
form es una propiedad de <input>. no obstante, no estamos limitado al contexto de <input>. como antes indique, se extiende hasta el scope mas alto en la jerarquia, de lo contrario las variables globales no serian legibles. lo que significa que podemos acceder a otras propiedades, siempre y cuando en el recorrido de los scopes no exista una propiedad o variable que lo superponga. por ejemplo,
forms es la coleccion de formularios y se accede desde el objeto
document.
Código:
// forms en document ;
<input type="button" name="bt" onclick="alert(forms)">
// forms aqui representa un elemento ;
<form>
<input type="button" name="bt" onclick="alert(forms)"> <br />
<input type="checkbox" name="forms" /> checkbox forms
</form>
en el segundo ejemplo,
forms es un <input> porque
forms pasa a ser una propiedad del elemento <form> debido a que se le ha asignado como valor al atributo
name de un control.
quien tenga el libro Javascript
: The Definitive Guide, puede encontrar los detalles en la seccion 17.1.6 de la quinta edicion, o la seccion 19.1.6 de la cuarta edicion.