我已经写了一段时间的JS,我一直在尝试调试jQuery jCarousel插件以兼容IE7。很多变量都是混淆的,这没关系,但我从未见过这样的语法:
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)
}
我从未见过将函数指定为迭代器,而且块语句内部看起来就像第一个例子。我知道在编写代码时我们都会努力节省几个字节,但对我而言,这种狂热的尝试是以给其他程序员带来完全混乱和困惑的代价。任何人都可以给我一个简单的,“速记”替代/彻底解释发生了什么?我总是希望更多地了解这种语言及其工作原理,谢谢。
答案 0 :(得分:2)
&&
operator计算每个表达式,直到找到一个真实的表达式,然后返回它。如果没有一个是真的,它会返回最后一个。
,
operator评估它的操作数并返回第二个(无论它们返回什么)。
所以在第一个例子中,它基本上是这样说的:
scroll: function (a, c) {
if (!this.locked && !this.animating) {
this.pauseAuto();
this.animate(this.pos(a), c)
}
}
至于第二个例子,重要的是要注意迭代是在k
变量上,而不是a
:
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)
}
}
对于第二个示例,请勿使用var
在一个,
语句中忘记possible to define multiple variables:
var a = 1,
b = 2,
c = 3;
重要的是要知道开发人员自己没有像这样最小化代码;他在易于阅读的块中用有意义的变量名写normal source code。在谈到发布时间时,他会通过缩小器(UglifyJS,Closure Compiler等)运行缩小版本以获得缩减代码。
答案 1 :(得分:0)
由于短路评估:
a && b && (c, d, e);
基本上相当于:
if (a) {
if (b) {
c;
d;
e;
}
}
表达式的值将为 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);
}
}