按照JS高程的說法,如下
replace()方法的第二個參數也可以是一個函數。在只有一個匹配項(即與模式匹配的字符串)的情況下,會向這個函數傳遞3個參數:模式的匹配項、模式匹配項在字符串中的位置和原始字符串。在正則表達式中定義了多個捕獲組的情況下,傳遞給函數的參數依次是模式的匹配項、第一個捕獲組的匹配項、第二個捕獲組的匹配項......,但最后兩個參數仍然分別是模式的匹配項在字符串中的位置和原始字符串。
高程的這種描述是有問題的,根據高程理解,若函數參數只有2個參數,那這兩個參數應分別是模式的匹配項在字符串中的位置和原始字符串。其實,這這兩個參數還是模式的匹配項、第一個捕獲組的匹配項。內部實現應該是用了arguments[0]、arguments[1]。下面這2段代碼可以進行理解。
var toUrl = 'user/add?id=$18&t=update'.replace(/\$(\d+)/g, function (a, b) { console.log(a); console.log(b); });
結果
var toUrl = 'user/add?id=$18&t=update'.replace(/\$(\d+)/g, function (a, b, c, d) { console.log(a); console.log(b); console.log(c); console.log(d); });
結果 
