4

我目前正在尝试使用 r.js 优化当前的 jQuery(开发版本 1.8.1)。这发生在使用 gem requirejs-rails 在 Rails 项目中进行资产编译期间。

我想我在优化器中遇到了一个错误。在 jquery 源代码的第 999 行附近,您会发现以下代码:

(function add(args) {
    jQuery.each(args, function (_, arg) {
        var type = jQuery.type(arg);
        if (type === "function" && (!options.unique || !self.has(arg))) {
            list.push(arg);
        } else if (arg && arg.length && type !== "string") {
            // Inspect recursively
            add(arg);
        }
    });
})(arguments);

当优化的 jquery 到达包含add(arg);错误的行时,将抛出add未定义的错误。这是因为优化器将函数重命名adde,而函数调用仍然add(...)像这样:

(function e(args) {
    jQuery.each(args, function (_, arg) {
        var type = jQuery.type(arg);
        if (type === "function" && (!options.unique || !self.has(arg))) {
            list.push(arg);
        } else if (arg && arg.length && type !== "string") {
            // Inspect recursively
            add(arg);
        }
    });
})(arguments);

我能够通过将代码重写为:

var fnAdd = function (args) {
    jQuery.each(args, function (_, arg) {
        var type = jQuery.type(arg);
        if (type === "function" && (!options.unique || !self.has(arg))) {
            list.push(arg);
        } else if (arg && arg.length && type !== "string") {
            // Inspect recursively
            console.log("inspecting", fnAdd);
            fnAdd(arg);
        }
    });
};
fnAdd(arguments);

这可以被认为是 r.js 中的错误吗?还是不允许使用javascript?我想知道为什么我是第一个遇到问题的人(至少谷歌没有透露任何解决方案)。

4

1 回答 1

1

我的猜测是它对我来说看起来像是一个错误。虽然我不会亲自使用您正在使用的语法,但它是有效的 JavaScript,所以对我来说,看起来 r.js 并不是为处理这种类型的递归函数调用而设计的。

出于兴趣,如果您将 add() 调用放在自身之外会发生什么?r.js 是否将其正确重命名为 e()?

于 2012-09-11T12:49:06.990 回答