0

私は Grunt と grunt-contrib-uglify を初めて使用します。テスト JavaScript ファイルを作成しました。

function global(window) {
  window.test = alert("Test");
  test();
})(window);

これを醜くすると、次のように表示されます。

!function(a){a.test=alert("Test"),test()}(window);

jsfiddle

私は2つのことで混乱しています:

  • ("Test")と の間にセミコロンではなくコンマがあるのはなぜtestですか?
  • このコードが実際に期待される結果を生成するのはどうしてでしょうか?

Chrome で実行すると、アラートは適切に表示されますが、コンソールは不平を言いUncaught TypeError: test is not a functionます。JSHint で実行すると、「代入または関数呼び出しが予期され、代わりに式が見られました」と報告されます。

grunt-contrib-uglify は、Chrome も私も完全に理解していない JavaScript の側面を利用していますか?

4

1 に答える 1

1

元のコードが無効であるため、Chrome でエラーが発生します。実際に行っているのは、の結果をalert("Test")to に代入することですwindow.testalertを返すため、後でundefined呼び出そうとすると、関数の代わりに参照されます。ここでは問題の原因にはなりませんでしたが、開き括弧もありません。testundefined

あなたがやろうとしているalertのは、事前定義された入力パラメーターでそれを呼び出すプロキシ関数を作成することです。次のようにbind()関数を使用してこれを行うことができます。

(function (window) {
    window.test = alert.bind(undefined, 'Test');
    test();
})(window);

上記は、期待される結果を生成するはずです。

セミコロンではなくコンマを使用する理由については、おそらく、圧縮されたコードが式に対して検証され (式とステートメントを参照)、セミコロンは式で許可されていませんが、コンマは許可されているためです。

于 2015-06-11T08:08:38.493 に答える