19

私は UglifyJS からのいくつかの出力を見ていましたが、次のようなコードに出くわしました:

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

そのコードを実行した後a1b文字列Hello, World!です。

一見、戻り値のない関数の結果が返されているように見えますが、その後にカンマと文字列リテラルが続くため、そうbなるように見えます。undefined

なぜこれが機能するのですか?
そして、なぜ UglifyJS は無名関数を実行しHello, World!てから次のステートメントとして返さないのでしょうか?

4

4 に答える 4

25

コンマ演算子により機能します。MDN 仕様から:

コンマ演算子は、両方のオペランドを (左から右に) 評価し、2 番目のオペランドの値を返します。

どちらの関数も 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 番目のオペランドの値を返します。

そうは言っても、コードがどのように評価されるかは明らかです。

すぐに実行される関数内で、コンマで区切られた 2 つの値を返します。

function () { a++; }()

'Hello World'

したがって、両方のオペランドが評価されます。これにより、変数がインクリメントaされ、関数の戻り値を作成する次の式につながりますb

undefined, 'Hello World'

最後に、右側のオペランドが外側の関数の値として返され、 value が得られbます'Hello World'

于 2012-10-26T16:09:40.000 に答える
0

JavaScriptのコンマ演算子を調べてください。

コンマ演算子は、両方のオペランドを (左から右に) 評価し、2 番目のオペランドの値を返します。

于 2012-10-26T16:10:06.807 に答える