2015-03-31 58 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的”)

至少在我的情况下,这是真正的问题