2012-04-20 85 views
0

我一直在写JS,我一直在试图调试IE7兼容性的jQuery jCarousel插件。很多变量会被混淆,这是确定的,但我从来没有见过的语法是这样的:任何人都可以从jCarousel解释下面的JavaScript代码吗?

scroll: function (a, c) { 
    !this.locked && !this.animating && (this.pauseAuto(), this.animate(this.pos(a), c)) 
} 

这似乎是某种速记符号的,但我从来没有碰到过这样的事。
同样,

for (var a = function (a) { 
    i.get(a).each(function() { 
     h(i, this, a, b, c) 
    }) 
}, k = d; k <= f; k++) { 
    k !== null && !(k >= j && k <= e) && a(k) 
} 

我从来没有见过的功能被指定为迭代器,并再次块语句里面看起来像第一个例子。我知道,当我们编写代码时,我们都努力保存几个字节,但对我来说,这种狂热的尝试是以对其他程序员完全混淆和困惑为代价的。任何人都可以给我一个简单的“长期”替代/彻底解释发生了什么?我总是想知道更多关于这种语言以及它是如何工作的,谢谢。

回答

2

&& operator评估每个表达式,直到它找到一个其是truthy,它回报。如果没有一个是真的,它会返回最后一个。

, operator评估它的操作数并返回第二个(不管它们返回什么)。

在第一个例子

因此,它基本上说:

var a = function (a) { 
    i.get(a).each(function() { 
     h(i, this, a, b, c) 
    }) 
}; 

for (k = d; k <= f; k++) { 
    if (k !== null && !(k >= j && k <= e)) { 
     a(k) 
    } 
} 

为:

scroll: function (a, c) { 
    if (!this.locked && !this.animating) { 
     this.pauseAuto(); 
     this.animate(this.pos(a), c) 
    } 
} 

至于第二个例子中,要注意的迭代是在k变量,而不是a很重要第二个例子,不要忘记它是possible to define multiple variables在一个var声明中使用,

var a = 1, 
    b = 2, 
    c = 3; 

知道,开发者自己没有减少这样的代码是很重要的;他正在写易于阅读块的有意义变量名称的normal source code。说到发布时间,他会通过缩小版(UglifyJS,Closure Compiler等)运行缩小版以获得缩减的代码。

+0

可以肯定的是,赋值给var a的函数中的参数是var a的一个先前声明的实例,对吗? – danronmoon 2012-04-20 16:11:15

+0

@moonDogDog:不,在函数中'a'将是传递的参数(在这种情况下'a(k)'在'for'循环中运行,所以在函数'a'内部将是'k ')。 – Matt 2012-04-20 16:13:54

0

由于短路评价的:

a && b && (c, d, e); 

基本上等同于:

if (a) { 
    if (b) { 
     c; 
     d; 
     e; 
    } 
} 

而表达式的值将是ë

在第二个示例中,函数不是迭代器,他只是使用for循环的第一个位置初始化一个匿名函数,然后将其分配给a

该代码的作者只是过于简洁。只因为你可以,并不意味着你应该。

更新

下面是第二实施例的再写入的内容应该是功能上等同的:

function a (a) { 
    i.get(a).each(function() { 
     h(i, this, a, b, c) 
    }); 
} 

for (k = d; k <= f; k++) { 
    if ((k !== null) && (!(k >= j && k <= e))) { 
     a(k); 
    } 
} 
+0

确定但是什么样的调用是 (this.pauseAuto(),this.animate(this.pos(a),c)) 为什么用圆括号包裹这些函数,并且这些函数如何用逗号分隔? – danronmoon 2012-04-20 16:05:41

+0

该parens是分组,而不是一个函数调用。逗号表示评估每个元素,然后返回最终元素值。 – kanaka 2012-04-20 16:07:52

+0

有没有办法在同一行代码中捕获每个分组的返回值? – danronmoon 2012-04-20 16:13:39

相关问题