3
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(););

这甚至可能吗?或者我根本不应该这样做?

4

3 回答 3

11

是的,如果你用逗号分隔函数:

foo && (bar(), baz())

这是一种糟糕的编码实践,但它对于缩小代码或代码高尔夫的目的很有用。

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())
于 2013-04-13T19:33:46.797 回答
2

不能在表达式中间放置分号。

foo && (doThis() || doThat());

由于doThis没有返回值,它的评估如下:

true && (doThis() || doThat());
(doThis() || doThat());
(undefined || doThat());
(doThat());
undefined;

但是正如@zzzzBov 所回答的那样,也可以使用逗号运算符,并且在它不依赖于返回值的意义上更好。

请注意,这样的速记不是很易读,您应该让缩小工具来完成这种工作。(例如闭包编译器

于 2013-04-13T19:32:58.973 回答
0

您可以使用逗号运算符

foo && (doThis(), doThat());

当然,如果doThis返回一个truthy值,您也可以拥有:

foo && doThis() && doThat();

但这更像是;

if (foo)
    if (doThis())
        doThat();

但是,如果左侧没有赋值,通常不会使用这种“速记”,因为这会使代码更丑陋且可读性较差。

于 2013-04-13T19:35:37.717 回答