为什么从 onclick 属性调用的函数 write() 解析为 document.write()?

Why does a function write() called from an onclick attribute resolve to document.write()?

为什么通过 onclick 属性调用的 write() 函数解析为 document.write() 并替换文档?有什么办法可以阻止这种情况发生吗?

<!-- Replaces the document with the text "from onclick." -->
<button onclick="write('from onclick.')">Write Function</button>

<!-- Logs the text "Alternate write function triggered... from onclick." -->
<button onclick="altWrite('from onclick.')">Alternate Write Function</button>

<script>
  function write (arg) {
    console.log("Write function triggered... " + arg);
  }

  function altWrite (arg) {
    console.log("Alternate write function triggered... " + arg);
  }

  // Logs the text "Write function triggered... from code."
  write("from code.");

  // Logs the text "Alternate write function triggered... from code."
  altWrite("from code.");
</script>

不幸的是,内联处理程序有不直观的 with 块:

(1) 调用它们的元素(这里是按钮)

(2) 文档:

因此,当从内联处理程序调用 write 时,作用域链 首先 在 [=15] 上看到 write 属性 =](并将其作为结果调用),而不是继续在 window 上搜索 write 属性(这是您定义的 write 函数所在的位置)。

解决方案是不使用内联处理程序:改用 addEventListener

function write(arg) {
  console.log("Write function triggered... " + arg);
}

function altWrite(arg) {
  console.log("Alternate write function triggered... " + arg);
}
const [button1, button2] = document.querySelectorAll('button');
button1.addEventListener('click', write);
button2.addEventListener('click', altWrite);
<button>Write Function</button>
<button>Alternate Write Function</button>