JavaScript中空方法为何像代码执行接收器(Sink)一样生效?
问题原因拆解
这跟方法b()本身没关系,代码是在传递参数给b()之前就执行了,根本轮不到b()来处理。
- 先看你写的调用代码:
a.b('' - alert(1) - '') - JS引擎执行这个语句时,会先计算括号里的参数表达式
'' - alert(1) - '',再把计算结果传给b()。 - 表达式里的
alert(1)是一个函数调用,JS会优先执行它——这就是为什么弹窗会出现。 - 等
alert(1)执行完,才会继续计算表达式的结果:alert()返回undefined,'' - undefined会被转换成NaN,再减''还是NaN,最后这个NaN才会被传给空方法b(),但b()啥也没做,所以后续没动静。
这和eval、setTimeout这类代码执行接收器完全不是一回事:
eval是把传入的字符串解析成代码执行;- 而你这里的
alert(1)本来就是合法的JS代码,只是作为表达式的一部分被提前执行了——哪怕你调用一个不存在的方法,比如xxx('' - alert(1) - ''),alert(1)照样会执行,因为参数表达式的计算是独立于目标方法的。
内容的提问来源于stack exchange,提问作者KeepCalmBaby
相关产品推荐
相关产品推荐

