2013-02-06 33 views
0

考慮下面的代碼:一個JavaScript的問題進行封閉

String.method('deentityify', function() { 
    var entity = { 
     quot: '"', 
     lt: '<', 
     gt: '>' 
    }; 

    return function() { 
     return this.replace(/&([^&;]);/g, 
      function (a, b) { 
       var r = entity[b]; 
       return typeof r === 'string' ? r : a; 
      } 
     ); 
    }; 
}()); 
document.write('deentityify: ' + '&lt;&quot;&gt;'.deentityify() + '<br>'); 

關於

function (a, b) { 
    var r = entity[b]; 
    return typeof r === 'string' ? r : a; 
} 

爲什麼匿名函數獲取參數值A,B?當然,我已經嘗試過,輸出是正確的。任何人都可以幫助我嗎?

回答

3

該函數實際上是「替換」調用的參數。正則表達式匹配作爲參數傳遞給函數。 寫代碼的另一種方式,它看起來:

function match(a, b) { 
    var r = entity[b]; 
    return typeof r === 'string' ? r : a; 
} 

var result = this.replace(/&([^&;]);/g, match) 

參數(a & B)的名稱是無關緊要的,可以是任何你喜歡的。 第一個參數將是匹配值,後續參數將是匹配組的值。因此,爲了清晰的功能可以寫成:

function matchFn(match, group1, group2, group3) { 
    var r = entity[group1]; 
    return typeof r === 'string' ? r : match; 
} 

引述MDN

的函數被調用,以創建新的子(把 到位子的,從參數#1接收)。提供給此函數的參數 在「指定函數 作爲參數」一節中進行了介紹。

+0

不要忘記,他們不必被稱爲'a'和'b' - 你可以調用這些參數,無論你想要什麼。 – Alnitak

+0

@Alnitak好點,回答更新 – Dve

+0

感謝您的幫助,這對我很有幫助 – Cyanny

1

您可以將函數作爲第二個參數移交到replace()。該功能充當某種回調功能,並按照Docs中所述的固定順序從主叫replace接收參數。

ab只是任意名稱 - a是匹配的子字符串和b捕獲組([^&;])

+1

究竟是什麼「靜態參數」?這是一個非常令人困惑的術語。 – Alnitak

+0

@Alnitak我的意思是靜態/固定訂單。換句話說希望更清楚。 – Christoph

+0

好的,非常感謝。 – Cyanny