我正在尝试理解那些大量使用逗号分隔表达式的脚本。例如:
popup_window != is_null && ("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);
如果逗号分离的意思是“评估所有以下表达式,然后生成最终表达式的值”(如this SO answer中所示),这是if语句的另一种形式吗?
像:
“如果popup_window不为null并且popup_window.close是一个方法,则调用此方法并将popup_window设置为null”
无论如何,我不确定我理解语法。
问题:
这句话意味着什么,逗号分离是什么?这应该是if语句吗?
谢谢!
答案 0 :(得分:2)
这是一系列陈述
popup_window != is_null // if true, continue to the statement in the parenthesis
&&
(
"function" == typeof popup_window.close // if true continue to close the window
&&
popup_window.close()
, popup_window = is_null // this is executed as long as "popup_window != is_null"
); // is truthy, it doesn't depend on the other conditions
假设is_null
确实是null
,首先popup_window
不能为空。
其次,我们可以假设popup_window
是另一个窗口,用window.open
打开,因为它应该具有close
函数,并且它有点像Yoda条件,但它也可以是写入
typeof popup_window.close === "function"
所以popup_window
必须有close
方法才能继续下一步。
最后一步关闭弹出窗口,如果它不为null,并且它有一个close
方法。
popup_window.close()
所以其他两个条件必须是真实的,必须有一个窗口,它必须有一个close
方法,然后调用close
方法,并且窗户关闭了。
然后是逗号。来自 docs
逗号运算符计算每个操作数(从左到右) 并返回最后一个操作数的值。
我们有
("function" == typeof popup_window.close && popup_window.close(), popup_window = is_null);
让我们用不同的方式写一下
( // ↓ must be thruthy .... ↓ for this to execute
(typeof popup_window.close === "function" && popup_window.close())
, popup_window = is_null
); // ↑ unrelated, it's just another operand, seperated by comma
这里的诀窍是,逗号之后的最后一部分总是被执行,因为所有被逗号分隔的操作数都会被评估。
这意味着,如果popup_window
不是is_null
,则popup_window
会明确设置为is_null
,无论第二个条件如何。
第二个条件也是只有popup_window
不是is_null
,它会检查是否有close()
方法,然后关闭窗口,逗号后的语句不相关到那个条件的结果。
要写得更简单(它本应该写成IMO的方式)
if ( popup_window != is_null ) {
if ( typeof popup_window.close === "function" ) {
popup_window.close();
}
popup_window = is_null;
}