19

我正在查看来自 UglifyJS 的一些东西的输出,并且发生在一些代码中,如下所示:

var a = 0;
var b = function () {
    return function () {
        a++;
    }(), 'Hello, World'
}();

运行该代码后a是字符串。1bHello, World!

乍一看,这似乎bundefined因为它看起来像一个没有返回值的函数的结果被返回,但后面跟着一个逗号和一个字符串文字。

为什么这行得通?
为什么 UglifyJS 不只是执行匿名函数然后Hello, World!作为下一条语句返回?

4

4 回答 4

25

由于逗号运算符,它可以工作。从 MDN 规范:

逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。

这两个函数都是IFFY,它们是立即执行的。

于 2012-10-26T16:07:44.213 回答
6

使用逗号运算符的表达式的结果是逗号运算符的右侧。

你有:

return a_function_call(), a_string

……所以你被a_string分配了。

于 2012-10-26T16:08:00.820 回答
3

首先让我在逗号运算符上引用 MDN

逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。

话虽如此,很明显,您的代码如何评估:

在立即执行的函数中,您返回以逗号分隔的 2 个值:

function () { a++; }()

'Hello World'

所以两个操作数都被评估了。这会增加您的变量a并导致创建函数的返回值的以下表达式b

undefined, 'Hello World'

最后,右操作数作为外部函数的值返回,从而给出bvalue 'Hello World'

于 2012-10-26T16:09:40.000 回答
0

查看JavaScript 中的逗号运算符

逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。

于 2012-10-26T16:10:06.807 回答