2010-09-09 68 views
1

我想深入瞭解javascript的細微差別。這個javascript序列究竟發生了什麼?

採取以下功能:

str.replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) { 
    ret[param] = value; 
}); 
  • 爲什麼有需要/ g的?
  • 什麼 正好被傳入 函數?
  • 這些值來自哪裏 從?

謝謝!

回答

5

爲什麼需要/ g?

因爲假設您在匹配的字符串中會有多個對,例如a:'b' c:'d'

究竟是什麼傳遞給函數?

回調函數獲取整個匹配作爲第一個參數,後面的兩個參數是在您的正則表達式中指定的捕獲組。

例如:

"a:'b' c:'d'".replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) { 
    console.log($0, param, value); 
}); 

回調將被執行兩次,它會告訴你的value"a:'b'"$0"a"param"b"第一執行。

在第二次執行 - 對於第二匹配 - ,會告訴你的價值"c:'d'"$0"c"param"d"

+0

我認爲這是一個jQuerys的相似的屬性選擇器?或者是一個js標籤解析器?不,是一個Json解析器;) – 2010-09-09 18:39:18

+0

所以,當一個函數被附加到任何給定的js函數的末尾時,它將充當一個回調函數,每個元素都將被傳遞給它?什麼決定了第一個價值,第二個和第三個價值? – 2010-09-09 18:48:42

+0

@Ming,不,當一個函數作爲String的replace方法的第二個參數傳遞時,它會針對每個遇到的匹配被調用,匹配的字符串將作爲該回調的第一個參數傳遞,其餘的參數是取決於您在正則表達式中的捕獲組的數量。 [更多信息...](https://developer.mozilla。org/en/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter) – CMS 2010-09-09 18:52:15

1

g in/g代表全局。這確保所有匹配被替換。在沒有/ g的情況下,只有第一個匹配被替換。 /我(忽略大小寫)是另一個常用的開關。

每當javascript引擎在字符串中找到一個匹配項(用於正則表達式)時,它會調用傳入的函數,併爲每個匹配項指定一個參數。

詳細解釋here