为什么这个JavaScript有效?

时间:2012-10-26 16:03:56

标签: javascript uglifyjs

我正在查看来自UglifyJS的一些内容的输出,并发生在以下代码中:

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

运行后,代码a1b为字符串Hello, World!

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

为什么这样做?
为什么UglifyJS不执行匿名函数然后返回Hello, World!作为下一个语句?

4 个答案:

答案 0 :(得分:25)

由于逗号运算符而起作用。来自MDN规范:

  

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

这两个函数都是IFFY,它们是在中间执行的。

答案 1 :(得分:6)

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

你有:

return a_function_call(), a_string

...所以你得到了a_string

答案 2 :(得分:4)

首先让我引用MDN on the comma operator

  

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

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

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

function () { a++; }()

'Hello World'

因此评估两个操作数。这会增加变量a,并为要创建b的函数的返回值指向以下表达式:

undefined, 'Hello World'

最后,右操作数作为外部函数的值返回,从而赋予b'Hello World'

答案 3 :(得分:0)

查看comma operator in JavaScript

  

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