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

Tampermonkey中smoothscroll.js的do-while赋值表达式报错修复求助

解决do-while循环中赋值作为条件的报错问题

这个报错其实是Tampermonkey内置的代码检查工具(类似ESLint)的“善意提醒”——它默认认为条件表达式里应该是比较逻辑(比如==/===),而不是赋值操作=,怕你是手滑写错了。但你这种写法其实是合理的(常用于遍历DOM父元素),功能没问题,只是不符合检查器的默认规则而已。下面给你两种简单的修复方案:

方案1:把赋值移到循环体内(最推荐,代码更清晰)

你的原代码大概是这样的:

function overflowingAncestor(el) {
  var elems = [];
  var rootScrollHeight = root.scrollHeight;
  do {
    // 这里是你处理el的逻辑,比如push到数组里
    elems.push(el);
  } while (el = el.parentNode); // 这里触发报错
}

可以把赋值操作从while条件里移到do循环的末尾,然后while只判断el是否存在:

function overflowingAncestor(el) {
  var elems = [];
  var rootScrollHeight = root.scrollHeight;
  do {
    elems.push(el);
    // 把赋值移到循环体内
    el = el.parentNode;
  } while (el); // 直接判断el是否为真值,逻辑和原来完全一致
}

这种写法更符合代码规范,检查器不会再报错,可读性也更好。

方案2:用括号包裹赋值表达式(最小改动)

如果你不想调整代码结构,只需要给while里的赋值加一层括号,告诉检查器“我是故意这么写的”:

function overflowingAncestor(el) {
  var elems = [];
  var rootScrollHeight = root.scrollHeight;
  do {
    elems.push(el);
  } while ((el = el.parentNode)); // 外层加括号,消除报错
}

如果遇到更严格的检查器,还可以加个注释明确说明:

} while ((el = el.parentNode) /* 有意使用赋值作为循环条件,遍历父元素 */);

两种方案都能解决报错,而且完全不影响脚本的原有功能,选哪种看你自己的代码习惯就好~

内容的提问来源于stack exchange,提问作者Black

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:37:47