Para añadir algún detalle de lo que sucede aquí es necesario comprender cadena de ámbitos de JavaScript.
ámbito de los objetos
Un objeto alcance está un objeto oculto crea cuando se ejecuta una función en la que las variables declaradas con var
se colocan como propiedades, también cualquier llamado function
dentro de la función de ejecución también se colocan como propiedades en el objeto de alcance
Cuando se solicita un identificador como mytest
, javascript busca ese nombre adjunto al objeto de ámbito actual (por cierto, el objeto de ámbito también se conoce como el "contexto de ejecución").
cadena de ámbito
Cuando se declara una función dentro de una función del objeto alcance actual está unido a la función. Cuando esta función interna se está ejecutando (y, por lo tanto, tiene su propio objeto de alcance), la ejecución del código tiene acceso no solo al objeto de ámbito actual sino también al objeto de ámbito en el que se creó la función que se está ejecutando actualmente. Detener aquí, volver a leer la última oración. Esto se conoce como cadena de alcance , la cadena será tan profunda como haya funciones dentro de las funciones (esto sucede mucho cuando se utilizan marcos como JQuery).
Por lo tanto, cuando la búsqueda de un identificador falla en el objeto de ámbito actual, se examina el siguiente objeto de ámbito en la cadena. Sigue subiendo por la cadena hasta que golpea el objeto global (las funciones declaradas a nivel global tienen el objeto global como su objeto de alcance).
atributo de evento Weirdness
Cuando los navegadores ejecutar código dentro del texto de un atributo onclick como se trata a este código como si se tratara de una función. Sin embargo, los navegadores harán cosas extrañas con la cadena de alcance aparente adjunta a esta "función". Normalmente inyectan el elemento actual y el elemento del documento (y tal vez otros elementos intermedios) como si fueran objetos de alcance en la cadena de alcance.
Por ejemplo, cambie el código onclick en su ejemplo a "alert (href)". Verá la ruta a su página seguida de #
en el cuadro de alerta. Esto se debe a que el elemento actual está en la cadena de alcance y, por lo tanto, href
se resuelve con su propiedad href
.
En el caso de la pregunta, el código llega al document
en la cadena de alcance (que se coloca encima del objeto de ventana global) y encuentra el identificador "mytest" (que hace referencia a un formulario) y por lo tanto intenta usar el valor de eso como una función (y falla).
Encontré este enlace que también lo explicaba http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html –