2010-08-16 160 views
12

JavaScript在JavaScript中的含义如下?这是什么意思...“var evt = event || window.event;”

var evt=event||window.event; 
+0

相关:[参考错误:事件未在Firefox中定义错误](http://stackoverflow.com/q/20522887/1048572)和[为什么'event'变量可用,即使没有作为参数传递?](http://stackoverflow.com/q/33167092/1048572) – Bergi 2016-08-31 17:54:19

回答

21

这意味着变量evt被分配给的所述event值,或者如果event未定义它被分配的window.event值。

这是如何工作的,在JavaScript中,布尔运算符不计算为true或false,而是计算最后一个不是falsy *或falsy值的对象的值。

因此,声明首先评估表达event || window.event。如果event为真,则表达式不需要进一步评估,因为OR只需要一个成员为真。因此返回event的值。如果event是虚假的,则需要评估OR运算符的右侧以确定结果是否为假。在这种情况下,如果window.event不是虚假的,则返回其值。

这是从事件处理程序获取事件对象的一个​​非常常见的习惯用法。在符合标准的浏览器上,事件对象作为第一个参数传递给事件处理程序。但在IE上,事件对象是一个全局变量。由于历史原因,所有全局变量都是窗口对象的成员。

因此,代码应该是这个样子:

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 

    /* ... */ 
} 

注:在javascript * falsy值是:假的,0,null和undefined。

+0

+1 for ..'historical reasons':两个单词来定义所有的兼容性问题,导致跨浏览器的图书馆事件(如'$','Prototype','YUI'等),以及为什么生活更容易,生活为什么更复杂。 – 2014-02-08 08:43:58

3

代码是黑客,因为微软决定把他们的事件放在全局window.event而不是作为参数传递给事件函数。

因此,此代码将尝试将evt设置为传入的事件(这将适用于非Microsoft浏览器),如果结果为null(因为它将用于Microsoft浏览器),它将会然后从全球抓住它。

从那时起,您的功能只需使用evt即可忽略浏览器差异(至少与事件相关的差异)。

2
var evt=event||window.event; 

上面的代码是一个快捷方式的if else语句,相当于娄代码:

var evt = "nothing valuable yet"; 
if (event) { 
    evt = event; 
} else { 
    evt = window.event; 
} 


两个IF ELSE快捷键在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