任何人都可以解释这句话的含义吗?
e = e || x
具体地,
e = e || window.event
这出现在我正在查看的一大块代码中。
我并没有完全失去,但我的理解是它将e和window.event(或x / what)分配给e。这很自然,对吧?
但是将e分配到e的价值是什么?不应该e = window.event就够了吗?也许取决于它是如何使用的?
答案 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”,而不是undefined
,null
,0
,NaN
,""
或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)
如果e
为undefined
(或null
或任何其他false
值),则会使用x
进行初始化。
隐含地说:
var e = e ? e : x;
答案 5 :(得分:2)
它不会将这两个值都分配给e
。如果x
的原始值为e
,e
,null
,{{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
}