r.js中的错误是递归函数吗?

时间:2012-09-11 12:39:27

标签: javascript jquery rjs

我目前正在尝试用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。这是因为优化器将函数add重命名为e,而函数调用仍然是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?我想知道为什么我是第一个遇到这个问题的人(至少谷歌没有透露任何解决方案)。

1 个答案:

答案 0 :(得分:1)

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

如果你把add()调用放在自身之外会发生什么? r.js是否正确地将其重命名为e()?