2015-06-11 2 views
0

Я новичок в Grunt и grunt-contrib-uglify. Я создал тест JavaScript файл:Grunt Uglify выводит код, который не согласен с

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

Когда это изуродованный, он выглядит как

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

jsfiddle

Я смущен две вещи:

  • Почему есть запятая, а не точка с запятой между ("Test") и test?
  • Как получается, что этот код действительно дает ожидаемый результат?

Когда я запускаю его в Chrome, появляется предупреждение, но консоль жалуется Uncaught TypeError: test is not a function. Когда я запускаю его через JSHint, он сообщает: «Ожидалось назначение или вызов функции, и вместо этого увидел выражение».

Есть ли grunt-contrib-uglify, используя преимущества JavaScript, которые ни Chrome, ни я полностью не понимаю?

ответ

1

Это вызывает ошибку в Chrome, поскольку исходный код недействителен. Фактически вы назначаете результат alert("Test") на window.test. alert возвращает undefined, поэтому, когда вы пытаетесь позвонить test, он ссылается на undefined вместо функции. Вам также не хватает открывающей скобки, хотя это не вызвало проблемы.

Похоже, что вы пытаетесь создать проксированную функцию alert, которая вызовет ее с предопределенным входным параметром. Вы можете сделать это с помощью функции bind(), как это:

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

выше следует производить свой ожидаемый результат.

Относительно того, почему он использует запятые, а не точки с запятой, вероятно, потому, что минифицированный код проверяет выражение (см. expressions vs statements), а точки с запятой не разрешены в выражениях, а запятые -.

+0

По крайней мере, моя ошибка заставила меня обнаружить [comma * operator *] (https://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/). –

Смежные вопросы