关于JavaScript中标签模板调用replace方法的疑问
解析代码
'a'.replace.call1${/./}${alert}`` 先拆解语法逻辑
这段代码用了标签模板的特殊写法,call被当作标签函数处理。模板字符串1${/./}${alert}会被JS引擎拆解为:
- 字符串数组:
['1', '', ''] - 插值结果:正则
/./、函数alert
所以实际等价于执行:
String.prototype.replace.call('1', /./, alert)
关于alert的this指向问题
replace调用其第二个参数(函数)时,不会把自身的this(也就是这里的字符串'1')绑定给这个函数。在非严格模式下,普通函数直接调用时this默认指向全局对象(浏览器环境就是window),而alert本身就是window的方法,所以执行时this自然是window,和replace的this无关。
为什么alert会收到参数1
当replace的第二个参数是函数时,这个函数会被自动传入以下参数:
- 第一个参数:匹配到的子串
- 后续参数:正则捕获组(如果有)、匹配位置、原字符串
这里正则/./匹配了字符串'1'的唯一字符'1',所以alert被调用时第一个参数就是'1',于是弹出了内容1。
内容的提问来源于stack exchange,提问作者Jackson
相关产品推荐
相关产品推荐

