4

私は現在、r.jsを使用して現在のjQuery(開発バージョン1.8.1)を最適化しようとしています。これは、gemrequirejs-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);

add(arg);最適化されたjqueryがエラーを含む行に到達すると、それ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は許可されていませんか?なぜ私が最初に問題を抱えているのだろうか(少なくともグーグルは解決策を明らかにしなかった)。

4

1 に答える 1

1

私の推測では、それは私にはバグのように見えます。あなたが使用している構文を個人的に使用するつもりはありませんが、有効な JavaScript であるため、r.js はこのタイプの再帰関数呼び出しを処理するように設計されていないようです。

興味深いことに、 add() 呼び出しをそれ自体の外に置くとどうなりますか? r.js は名前を e() に正しく変更しますか?

于 2012-09-11T12:49:06.990 に答える