Javascript 为什么缩小代码不等同于原始代码?

Javascript 为什么缩小代码不等同于原始代码?,javascript,minify,slickgrid,Javascript,Minify,Slickgrid,当我在发布模式下运行我的MVC4项目时,一个使用的页面没有正确显示(网格非常非常高,网格单元缺失) 然而,我不认为这是SlickGrid的问题,而是集成到MVC4中的bundler(System.Web.Optimization)如何缩小代码的问题 我抓起缩小的JavaScript,开始一次在一个区域中反转缩小,直到问题得到解决。我发现正在更改(请原谅滚动,我想让缩小版保持原样) 为SlickGrid提供回调函数以过滤掉某些结果 原始函数和缩小函数是如何不等价的 更新 SlickGrid正在“编

当我在发布模式下运行我的MVC4项目时,一个使用的页面没有正确显示(网格非常非常高,网格单元缺失)

然而,我不认为这是SlickGrid的问题,而是集成到MVC4中的bundler(
System.Web.Optimization
)如何缩小代码的问题

我抓起缩小的JavaScript,开始一次在一个区域中反转缩小,直到问题得到解决。我发现正在更改(请原谅滚动,我想让缩小版保持原样)

为SlickGrid提供回调函数以过滤掉某些结果

原始函数和缩小函数是如何不等价的

更新

SlickGrid正在“编译”我提供的过滤函数。该编译步骤在缩小版本中失败。编译的精简代码如下所示:

function anonymous(_items,_args) {
var _retval = [], _idx = 0; var n,  t = _args; _coreloop: for (var _i = 0, _il = _items.length; _i < _il; _i++) { n = _items[_i]; 
    //debugger;
    var i = n.option,
        r = t.searchString;

    return 
    n.pctSortKey.key < t.percentCompleteThreshold 
    || 
    r !="" 
        && i.indexOf(r)==-1 
        && i != "Unweighted Response" 
        && i != "Median"
        && i != "Average"
? !1
: !0
; } return _retval; 
}
函数匿名(\u项,\u参数){
var _retval=[],_idx=0;var n,t=_args;_coreloop:for(var _i=0,_il=_items.length;_i<_il;_i++){n=_items[_i];
//调试器;
var i=n.选项,
r=t.searchString;
返回
n、 pctSortKey.key
请注意多个返回语句

有了这个额外的洞察力,我能够识别出一个相关的SlickGrid bug:


我看到的一个区别是,item.option和args.searchString即使在第一个条件为true时也会被计算,而它们本来不在原始代码中

您是否尝试过进入代码以查看值是什么以及它是如何作用于这些值的

这是一个未混合的简化代码,用于保存其他正在执行相同操作的用户,或者如果您希望尝试并使用它

function SlickFilter(n,t) {
var i = n.option,
    r = t.searchString;

return 
        n.pctSortKey.key < t.percentCompleteThreshold 
        || 
        r !="" 
            && i.indexOf(r)==-1 
            && i != "Unweighted Response" 
            && i != "Median"
            && i != "Average"
    ? !1
    : !0
}
功能过滤器(n,t){
var i=n.选项,
r=t.searchString;
返回
n、 pctSortKey.key
编辑(按操作)

这让我走上了正确的道路,但事实证明,SlickGrid正在“编译”过滤器函数。有一个已知的问题,编译器有时会失败。事实上,编译是可选的,在这种情况下没有必要,因为minifier已经生成了优化的代码


你是一个人在缩小js吗?有很多迷你们工具,所以我建议你尝试另一个。@Lolo:不,我正在使用集成到MVC4中的
System.Web.Optimization
。更新了问题来澄清这一点。我的错,我真的帮不了你。很抱歉(我遇到了类似的问题,但我自己也在做,更换工具解决了问题)奇怪的是,在被问到这个问题好几个月后,有人在没有任何评论的情况下否决了这个问题。我同意你的观点——这是我看到的唯一区别。但是,计算这两个项的差异不应该有任何影响——它们只是返回值,因此没有代码实际执行的方式有任何不同。即使它们不存在,也只会返回undefined,代码将继续。短路的
|
意味着
i
r
的值将永远不会被使用,除非第一行没有发生,这与它们是分开的
if
语句时的行为相同。看起来合适的括号将正确地修复它,对于记录,从return到,此格式化版本与我发布的版本表现出相同的行为。根据你的建议,我现在正在调试以寻找副作用。我会让你知道的!打那个!把它倒过来。使用此版本的代码进行调试时,SlickGrid代码库中出现错误。要用非缩小的SlickGrid进行调试。@technosaurus虽然没有括号,但它的行为应该正确-
&
|
具有优先级,因此在第一行运行后,
&
一起计算(假设第一行为false),然后它们一起“或”。它们都比
?:
操作符具有优先级,因此将根据整个top表达式的结果执行。在现实生活中,我从来没有写过这样的代码,但在小型电脑中,应该没问题。
dataView.setFilter(SlickFilter);
function anonymous(_items,_args) {
var _retval = [], _idx = 0; var n,  t = _args; _coreloop: for (var _i = 0, _il = _items.length; _i < _il; _i++) { n = _items[_i]; 
    //debugger;
    var i = n.option,
        r = t.searchString;

    return 
    n.pctSortKey.key < t.percentCompleteThreshold 
    || 
    r !="" 
        && i.indexOf(r)==-1 
        && i != "Unweighted Response" 
        && i != "Median"
        && i != "Average"
? !1
: !0
; } return _retval; 
}
function SlickFilter(n,t) {
var i = n.option,
    r = t.searchString;

return 
        n.pctSortKey.key < t.percentCompleteThreshold 
        || 
        r !="" 
            && i.indexOf(r)==-1 
            && i != "Unweighted Response" 
            && i != "Median"
            && i != "Average"
    ? !1
    : !0
}