2015-03-31 66 views
2

我有一個JS文件,我試圖縮小,但它有一些麻煩。這裏是文件:Javascript minifier刪除函數

$(document).ready(function() { 
function DisplayMessage(message, iserror) { 
    var htmlclass = iserror ? "error" : "success"; 

    $('div.response-message').empty() 
     .append(message) 
     .addClass(htmlclass); 

    $('div.response-message').animate({ 
     top: "-1px" 
    }, 1000, function() { 
     alert("donee"); 
    }); 
} 

$('.account-overlay-link > a.link').click(function (e) { 
    e.preventDefault(); 
    $('.account-overlay.background').removeClass("hide"); 
}); 

$('.account-overlay > .area > .close').click(function (e) { 
    e.preventDefault(); 
    $('.account-overlay.background').addClass("hide"); 
}); 
}); 

正如你可以看到我有一個常規的JavaScript函數在頂部和兩個jQuery事件處理程序下面。當我保存文件以縮小文件時,縮小文件包含兩個jQuery處理程序,但無法看到該函數。

奇怪的是,如果我刪除了兩個jQuery塊但保留了該函數,文件仍然會縮小,但它是空白的(除了(document).ready),就好像函數不存在一樣。

我試圖重新創建該文件,重新啓動視覺工作室,但沒有什麼工作......

回答

4

你的功能不被「準備就緒」的處理函數中的任何代碼調用,所以它是被淘汰的死代碼。處理程序外部沒有任何東西可以調用它。

如果你希望函數是全局可見的符號,你必須明確地將其分配到window對象的屬性:

$(document).ready(function() { 
function DisplayMessage(message, iserror) { 
    var htmlclass = iserror ? "error" : "success"; 

    $('div.response-message').empty() 
     .append(message) 
     .addClass(htmlclass); 

    $('div.response-message').animate({ 
     top: "-1px" 
    }, 1000, function() { 
     alert("donee"); 
    }); 
} 
window.DisplayMessage = DisplayMessage; 

如果你這樣做,minifier不會去掉它。

+0

這樣不幸 – Frayt 2015-03-31 17:50:28

+0

@Frayt以及minifier你用的是什麼window.DisplayMessage並不能改變什麼?就個人而言,如果將一個函數引用複製到'window'屬性並沒有使其成爲「活的」,我認爲它是一個錯誤,但是你的縮小器可能會要求你明確地告訴它(通過特殊的評論或某個東西)不要視爲死代碼。 – Pointy 2015-03-31 17:54:36

+0

@Frayt還注意到'window.DisplayMessage = DisplayMessage''需要** **外的函數,而不是裏面的。 – Pointy 2015-03-31 17:55:12

0

另一件事要記住的是,一些minifiers無法處理「特殊」的關鍵字...

考慮到檢查你的代碼,如果它包含像

  • 讓利「花哨」的東西,常量
  • 特殊環等爲(myData的的一個變種)
  • 特殊檢查,如如果(在myObject的 「myProperty的」)

至少在我的情況下,這是真正的問題