我目前正在尝试用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?我想知道为什么我是第一个遇到这个问题的人(至少谷歌没有透露任何解决方案)。
答案 0 :(得分:1)
我的猜测对我来说看起来像个错误。虽然我不会亲自使用您正在使用的语法,但它是有效的JavaScript,所以看起来r.js不是为处理这种类型的递归函数调用而设计的。
如果你把add()调用放在自身之外会发生什么? r.js是否正确地将其重命名为e()?