You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:52:05