0

我写 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)
}

我从未见过将函数分配为迭代器,并且里面的块语句再次看起来像第一个示例。我知道我们在编写代码时都在努力节省几个字节,但对我来说,这种狂热的尝试是以让其他程序员完全困惑和困惑为代价的。任何人都可以给我一个简单的“速记”替代/彻底解释正在发生的事情吗?我一直想更多地了解这种语言及其工作原理,谢谢。

4

2 回答 2

2

&&运算符对每个表达式求值,直到找到一个为真的表达式,然后返回。如果没有一个是真的,它会返回最后一个。

,运算符评估它的两个操作数并返回第二个(无论它们返回什么)。

所以在第一个例子中,它基本上是在说:

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,

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

重要的是要知道开发人员自己并没有像这样最小化代码;他在易于阅读的块中编写具有有意义的变量名的普通源代码。当谈到发布时间时,他将通过一个缩小器(UglifyJSClosure Compiler等)运行缩小后的版本以获取精简后的代码。

于 2012-04-20T16:04:58.267 回答
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);
    }
}
于 2012-04-20T16:04:54.597 回答