var foo = true;
function doThis() {alert("do this");}
function doThat() {alert("do that");}
// fine
if(foo) {
doThis();
doThat();
}
// fine
foo && (doThis());
// NO, syntax error
foo && (doThis(); doThat(););
这甚至可能吗?或者我根本不应该这样做?
答案 0 :(得分:9)
是的,如果用逗号分隔函数:
foo && (bar(), baz())
这是一个可怕的编码实践,但它对于缩小代码或code golf的目的很有用。
if (foo) {
bar();
baz();
}
变成:
foo&&(bar(),baz())
和
if (!foo) {
bar();
baz();
}
变成:
foo||(bar(),baz())
和
if (foo) {
bar();
baz();
} else {
fizz();
buzz();
}
变成:
foo?(bar(),baz()):(fizz(),buzz())
尽管变量可能会在缩小器中重命名为:
a&&(b(),c())
答案 1 :(得分:2)
你不能在表达式的中间加一个分号。
foo && (doThis() || doThat());
由于doThis
没有返回值,因此评估如下:
true && (doThis() || doThat());
(doThis() || doThat());
(undefined || doThat());
(doThat());
undefined;
但正如@zzzzBov所回答的那样,comma operator也可以使用,从某种意义上说它不依赖于返回值。
请注意,这些简写不是很易读,你应该让缩小工具做那种工作。 (例如Closure Compiler)
答案 2 :(得分:0)
您可以使用comma operator:
foo && (doThis(), doThat());
当然,如果doThis
返回truthy
值,您还可以:
foo && doThis() && doThat();
但它更像是;
if (foo)
if (doThis())
doThat();
然而,如果左侧没有赋值,通常不会使用这种“速记”,因为这会使代码变得更加丑陋,而且可读性更低。