有人可以解释e = e || X?为什么要把e分配给e?

时间:2013-07-15 15:40:12

标签: javascript events javascript-events

任何人都可以解释这句话的含义吗?

e = e || x

具体地,

e = e || window.event

这出现在我正在查看的一大块代码中。

我并没有完全失去,但我的理解是它将e和window.event(或x / what)分配给e。这很自然,对吧?

但是将e分配到e的价值是什么?不应该e = window.event就够了吗?也许取决于它是如何使用的?

10 个答案:

答案 0 :(得分:18)

如果e = e || x评估为假,则{p> x会将e分配给e

这与:

相同
if (!e) {
  e = x;
}
// or
e = e ? e : x

这是一个表格,显示哪些值的评估值为 false https://stackoverflow.com/a/7615236/603003

最重要的值是: null undefined

<小时/> 在你的背景下它意味着什么? 您可能有某种代码:

function handler(e) {
  e = e || window.event;
}

其中handler是附加到DOM元素的事件侦听器。由于旧版本的IE没有将事件对象作为参数传递,因此必须检查参数是否为 undefined 。如果是后者,则将全局window.event对象(IE提供的对象)分配给e

答案 1 :(得分:6)

它不会将两者分配给“e”,而不是undefinednull0NaN""false。它更喜欢“{”到window.event的原始值,因为“e”位于||的左侧,但如果它是空的(我列出的那些值中的一个),那么将指定“e” window.event

这样做是因为Internet Explorer没有将事件引用作为参数传递,而是简单地绑定到全局符号。事件处理程序经常被写出来:

function someHandler(e) {
  e = e || window.event;
  // ...
}

写作可能更严格“正确”:

function pedanticHandler(e) {
  if (e === undefined) // or arguments.length == 0 perhaps
    e = window.event;
  // ...
}

答案 2 :(得分:4)

你误解了操作员。

此行将表达式 e || x指定给变量e

e || x的值是第一个真值 如果e是真实的,那将是e;如果e是假的,则为x

答案 3 :(得分:2)

分配e = e是多余的,他们将此作为本声明的一部分,因为它是一个成语。

该语句检查是否定义了e,如果不定义,则使用||后面的表达式对其进行初始化。这是有效的,因为当评估||表达式时,解释器会在找到第一个true部分(从左侧)时停止评估。

特别是,如果e评估为true,则评估会立即停止,并且实际上您有e = e,这是多余的。但是,如果e未定义或评估为false,那么||的右侧部分将被评估并分配给e

我个人会使用if声明而不是聪明。或者进一步重构代码以完全避免if

编辑:我认为原始代码是错误的。显然,目的是检查e是否已经初始化。但是如果已经初始化并评估为true,则可以将其重新分配给自己。这可能会产生不良副作用。

答案 4 :(得分:2)

如果eundefined(或null或任何其他false值),则会使用x进行初始化。

隐含地说:

var e = e ? e : x;

答案 5 :(得分:2)

它不会将这两个值都分配给e。如果x的原始值为eenull,{{1},这只是将undefined分配给0的一种方式},false或空字符串(NaN)。如果""的原始值与上述任何条件都不匹配,则会保留原始值。

基本上,它是以下的简写形式:

e

答案 6 :(得分:2)

上述答案(ComFreek)是正确的。这样做的原因是因为懒惰的评估。懒惰评估的布尔x || y将首先检查x。如果它的计算结果为TRUE(即非零,非空),则表达式停止并返回TRUE。如果x评估为FALSE,则会返回y

这是一个聪明的代码。聪明是愚蠢的。 (意见) 作为维护者,我更愿意看到

if (!e) {
    e = x;
}

答案 7 :(得分:1)

它设置e等于其自身(如果它不是null,undefined或false),否则window.event。

就像说

if (!e) e = window.event;

答案 8 :(得分:1)

在您的示例中,e = e || window.event;相当于:

if(!e){
     e = window.event;
}

答案 9 :(得分:1)

将eventhandler添加到元素

document.addEventListener('click',handler,false);

在大多数浏览器中,它将事件作为第一个参数传递。

handler=function(e){// e is the event in some browsers
 e=e||window.event; // but in some old browsers the event is window.event
  // so you check if e(event) exists else you use window.event.
  // '||' means or...
  // e is already defined as a placeholder in the handler function
  // so you don't need to put var infront of it
}