谁能解释一下这句话的意思?
e = e || x
具体来说,
e = e || window.event
这出现在我正在查看的一大段代码中。
我并没有完全不知所措,但是我的理解是它将e和window.event(或x/whatever)都分配给e。这很自然,对吧?
但是将 e 分配给 e 的值是什么?e = window.event 不应该足够吗?也许取决于它的使用方式?
谁能解释一下这句话的意思?
e = e || x
具体来说,
e = e || window.event
这出现在我正在查看的一大段代码中。
我并没有完全不知所措,但是我的理解是它将e和window.event(或x/whatever)都分配给e。这很自然,对吧?
但是将 e 分配给 e 的值是什么?e = window.event 不应该足够吗?也许取决于它的使用方式?
e = e || x
分配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
.
它不会将两者都分配给“e”,而只会分配不是undefined
, null
, 0
, NaN
,""
或的那个false
。它更喜欢 "e" 的原始值,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;
// ...
}
你误解了运营商。
此行将表达式 e || x
分配给变量 e
。
的值e || x
是第一个真值。
如果e
是真的,那就是e
;如果e
是假的,它将是x
.
分配是多余的e = e
,他们将其作为此语句的一部分,因为它是一个成语。
该语句检查是否e
已定义,如果未定义,则使用后面的表达式对其进行初始化||
。这是有效的,因为当||
表达式被评估时,解释器在true
找到第一部分(从左起)时停止评估。
特别是,如果e
评估到,true
那么评估就会立即停止,并且实际上你有e = e
,这是多余的。但是如果e
未定义或计算结果为,false
则计算结果的右侧部分||
并将其分配给e
。
我个人会使用if
声明而不是聪明。或者甚至更多地重构代码以完全避免if
。
编辑:我认为原始代码有问题。显然目的是检查是否e
已经初始化。但是在这里,如果它已经初始化并计算为 ,则可以将其重新分配给自身true
。这可能会产生不必要的副作用。
如果e
是undefined
(或null
,或任何其他false
值),则用 初始化x
。
它是隐含的:
var e = e ? e : x;
它不会将两个值都分配给e
. 如果原始值是, , , , , 还是空字符串 ( ) ,这只是一种分配方式x
。如果原始值不符合上述任何条件,则保留原始值。e
e
null
undefined
0
false
NaN
""
e
基本上,它是以下的简写形式:
if(!e) {
e = x;
}
上述答案(ComFreek)是正确的。它这样做的原因是因为惰性评估。x || y
懒惰地评估的布尔值将x
首先检查。如果它的计算结果为TRUE
(即非零、非空),则表达式停止并返回 TRUE。如果x
计算结果为FALSE
,它将返回y
。
这是聪明的代码。聪明是愚蠢的。(观点)作为维护者,我更喜欢看
if (!e) {
e = x;
}
它设置 e 等于它本身(如果它不为 null、未定义或 false),否则为 window.event。
这就像说
if (!e) e = window.event;
在您的示例e = e || window.event;
中相当于:
if(!e){
e = window.event;
}
当您将事件处理程序添加到元素时
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
}