¿Qué significa lo siguiente en JavaScript?¿Cuál es el significado de esto ... "var evt = event || window.event;"
var evt=event||window.event;
¿Qué significa lo siguiente en JavaScript?¿Cuál es el significado de esto ... "var evt = event || window.event;"
var evt=event||window.event;
Esto significa que la variable de evt
se asigna al valor de event
o si event
es indefinido se le asigna el valor de window.event
.
Cómo funciona esto es que en javascript, los operadores booleanos no se evalúan como verdadero o falso, sino que se evalúa como el valor del último objeto que no es falso * o el valor falso.
Así que la declaración primero evalúa la expresión event || window.event
. Si event
es verdadero, entonces la expresión no necesita ser evaluada ya que un OR solo necesita que un miembro sea verdadero. Por lo tanto, se devuelve el valor de event
. Si event
es falso, entonces se debe evaluar el lado derecho del operador OR para determinar si el resultado es falso. En cuyo caso, si window.event
no es falso, se devuelve su valor.
Este es un modismo muy común para obtener el objeto de evento de los controladores de eventos. En navegadores compatibles con estándares, el objeto de evento se pasa como el primer parámetro al controlador de eventos. Pero en IE, el objeto de evento es una variable global. Y por razones históricas, todas las variables globales son miembros del objeto ventana.
Así que el código debería ser algo como esto:
element.onclick = function (event) {
var evt = event || // use the value of event if available or
window.event;// if not assume it's IE and use window.event
/* ... */
}
Nota: * Los valores Falsy en javascript son: false, 0, nula e indefinido.
+1 por ..'historical reasons': dos palabras para definir toda la compatibilidad problemas, resuelve las ocurrencias de la biblioteca de navegadores cruzados (como '$', 'Prototype', 'YUI', etc.) y por qué la vida es más fácil y por qué la vida es más complicada. –
El código es un hack porque Microsoft decidió colocar sus eventos en el window.event
global en lugar de pasarlo como un parámetro a la función de evento.
Por lo tanto, este código intentará establecer evt
al evento aprobada en (que va a trabajar para los navegadores que no sean Microsoft) y, en caso de que resulte ser null
(como lo será para los navegadores de Microsoft), lo hará luego tomarlo de lo global.
A partir de ese momento, su función solo puede usar evt
sin tener en cuenta las diferencias del navegador (bueno, al menos aquellas relacionadas con los eventos).
var evt=event||window.event;
El código anterior es un acceso directo a una instrucción ELSE IF, y es equivalente al código abajo:
var evt = "nothing valuable yet";
if (event) {
evt = event;
} else {
evt = window.event;
}
dos si atajos ELSE en Javascript:
var resultIsTrue = true || false; // if first value is true, return first value
var resultIsFalse = true && false; // if first value is true, return second value
Relacionado: [Error de referencia: evento no definido en Firefox] (http://stackoverflow.com/q/20522887/1048572) y [¿Por qué la variable 'evento' está disponible incluso cuando no se pasa como parámetro?] (Http://stackoverflow.com/q/33167092/1048572) – Bergi