我正在查看来自UglifyJS的一些内容的输出,并发生在以下代码中:
var a = 0;
var b = function () {
return function () {
a++;
}(), 'Hello, World'
}();
运行后,代码a
为1
,b
为字符串Hello, World!
。
乍一看似乎b
将是undefined
,因为它看起来像是没有返回值的函数的结果,但后面跟着一个逗号和一个字符串文字。
为什么这样做?
为什么UglifyJS不执行匿名函数然后返回Hello, World!
作为下一个语句?
答案 0 :(得分:25)
由于逗号运算符而起作用。来自MDN规范:
逗号运算符计算它的两个操作数(从左到右)并返回第二个操作数的值。
这两个函数都是IFFY,它们是在中间执行的。
答案 1 :(得分:6)
答案 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。
逗号运算符计算它的两个操作数(从左到右)并返回第二个操作数的值。