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

基于自调用setTimeout的打字机函数更新变量仅返回首字符问题

问题原因
  • setTimeout属于异步API,调用后不会阻塞同步代码的执行,首次调用typeWriter()时仅会完成1次字符拼接就返回当前x的值(仅包含第一个字符),后续定时器触发的函数执行不会修改已经完成赋值的x初始值
  • 原代码的DOM更新逻辑放在了脚本同步执行阶段,只会执行1次,不会随着后续字符拼接同步更新页面内容
修复后完整代码
<!DOCTYPE html>
<html>
<body>

<h1>Typewriter</h1>

<p id="demo"></p>

<script>
var i = 0;
var txt = 'Lorem ipsum dummy text blabla.';
var speed = 50;
var x = "";
// 直接调用函数,不需要接收返回值
typeWriter();

function typeWriter() {
  if (i < txt.length) {
    x += txt.charAt(i);
    // 每次拼接完成后立即更新DOM
    document.getElementById("demo").innerHTML = x;
    i++;
    setTimeout(typeWriter, speed);
  } else {
    // 打字全部完成后的逻辑可以写在这里,此时x就是全量文本
  }
}
</script>

</body>
</html>
修改说明
  • 移除了外层x = typeWriter()的赋值逻辑和外层单独的DOM更新语句,异步函数的全量拼接结果无法在同步执行阶段拿到
  • 将DOM更新逻辑移入typeWriter函数内部,每次拼接新字符后立即更新页面,即可实现逐字输出的打字机效果
  • 如果需要打字完成后使用全量文本,相关逻辑可以放在上述代码的else分支中执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:57:03