为什么我不能直接将函数传递给replace方法?

时间:2016-02-11 13:34:24

标签: javascript regex str-replace

我根本无法理解为什么第二行和第三行的输出彼此不同:

alphabet_ASCII = '';
for (i=65; i<=90; i++) {
  alphabet_ASCII += i;
}
alphabet_ASCII += '<br>';

document.body.innerHTML += alphabet_ASCII;



document.body.innerHTML += 
  alphabet_ASCII.replace(/\d{2}/g, x=>String.fromCharCode(x));

document.body.innerHTML += 
  alphabet_ASCII.replace(/\d{2}/g, String.fromCharCode);

x=>String.fromCharCode(x)String.fromCharCode之间有什么区别?

1 个答案:

答案 0 :(得分:6)

因为String.fromCharCode接受多个参数,而replace调用回调的次数不仅仅是您期望的一个参数:它使用以下函数调用回调:

  • 所有匹配的文字
  • 任何捕获组(如果有)的内容
  • 发生此匹配的索引(偏移量)
  • 整个字符串正在执行

More on MDN.

所以在你的第二个例子中,String.fromCharCode获得的参数多于你的第一个参数,并且最好用它们。在第一次回调时,String.fromCharCode获得"65", 0, "6566676869707172737475767778798081828384858687888990",因此返回"A\u0000\u0000"(因为第二个参数为0,第三个参数无效)。在第二遍时,它获得"66", 2, "6566676869707172737475767778798081828384858687888990"并返回"B\u0002\u0000"等等。