2012-09-11 64 views
4

我目前正試圖用r.js優化當前的jQuery(開發版本1.8.1)。 這發生在使用gem requirejs-rails的rails項目的資產編譯過程中。遞歸函數r.js中的錯誤?

我想我在優化器中遇到了一個錯誤。圍繞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?我想知道爲什麼我是第一個遇到問題的人(至少谷歌沒有任何解決辦法)。

回答

1

我的猜測是它看起來像一個bug。雖然我不會親自使用您使用的語法,但它對我來說是有效的JavaScript它看起來像r.js不是爲了處理這種類型的遞歸函數調用而設計的。

出於興趣如果您將add()調用放在自身之外會發生什麼? r.js是否將它正確地重命名爲e()?