最近看Qwrap代码,查阅了一些关于replace里function参数的问题。
ECMScript文档里写的是
String.prototype.replace (searchValue, replaceValue)
如果 replaceValue 是函数,则对每个匹配的子字符串,以 m + 3 个参数调用这个函数。第一个参数是匹配的子字符串。如果 searchValue 是正则表达式,接下来 m 个参数是 MatchResult(见 15.10.2.1)里的所有捕获值。第 m + 2 个参数是发生的匹配在 string 里的偏移量,第 m + 3 个参数是 string。结果是将输入的原字符串里的每个匹配子字符串替换为相应函数调用的返回值(必要的情况下转换为字符串)得到的字符串。
http://ecmascript.cn/#387
runcode
<html> <body> <script> var QW={}; /** * @class Browser js的运行环境,浏览器以及版本信息。(Browser仅基于userAgent进行嗅探,存在不严谨的缺陷。) * @singleton * @namespace QW */ QW.Browser = (function() { var na = window.navigator, ua = na.userAgent.toLowerCase(), browserTester = /(msie|webkit|gecko|presto|opera|safari|firefox|chrome|maxthon|android|ipad|iphone|webos|hpwos)[ \/os]*([\d_.]+)/ig, Browser = { platform: na.platform }; ua.replace(browserTester, function(a, b, c) { var bLower = b.toLowerCase(); for(var i = 0;i < arguments.length;i++){ document.write("第"+(i+1)+"个参数的值:"+arguments[i]+"<br />"); } if (!Browser[bLower]) { Browser[bLower] = c; } }); if (Browser.opera) { //Opera9.8后版本号位置变化 ua.replace(/opera.*version\/([\d.]+)/, function(a, b) { Browser.opera = b; }); } if (Browser.msie) { Browser.ie = Browser.msie; var v = parseInt(Browser.msie, 10); Browser['ie' + v] = true; } return Browser; }()); if (QW.Browser.ie) { try { document.execCommand("BackgroundImageCache", false, true); } catch (e) {} } </script> </body> </html>
运行代码 [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
第一个参数得到的是匹配的整体字符串
然后依次的参数得到的是括号包括的子字符串
倒数第二个参数是字符串的偏移量
最后一个参数返回的是整个字符串。
https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/String/replace