武人 2024-02-23 21:12 采纳率: 100%
浏览 9
已结题

关于#javascript#的问题:内联侦听器原理

为什么alert可以打印alert function,close不行

<html>
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  </head>
  <body>
    <script>
      function close() {
        console.log('close function');
      }
      function alert() {
        console.log('alert function');
      }
    </script>
    <button onclick="close()">close btn</button>
    <button onclick="alert()">alert btn</button>
  </body>
</html>

  • 写回答

3条回答 默认 最新

  • 武人 2024-03-02 18:13
    关注

    在这段 HTML 代码中,定义了两个全局的 JavaScript 函数:closealert,并且两个按钮的 onclick 事件分别尝试调用这两个函数。但是,点击 close 按钮并没有得到预期的 close function 的控制台输出。问题在于 close 函数与全局作用域上 window.close 方法冲突。

    在浏览器环境中,全局定义的函数会成为 window 对象的一部分,也就是说,定义了一个名为 close 的函数后,它会被视为 window.close。但是,window.close 在浏览器中是一个内置函数,用来关闭当前窗口。当点击按钮时,onclick 事件处理中的 close() 实际上在尝试调用 window.close,而不是你定义的 close 函数。

    close 不同,尽管 alert 也是 window 对象的一个方法,但是当你定义自己的 alert 函数时,它覆盖了原来的 window.alert 方法。因此,点击 alert 按钮就能够成功地调用你定义的 alert 函数,并输出到控制台。

    如果想要调用自己定义的 close 函数,需要避免直接调用像 window.close 这样的内置方法。你可以通过改变函数名或使用 window 对象上不存在的属性名来避开这个问题。

    例如,将函数名 close 更改为 closeWindow,然后同步更改按钮的 onclick 事件:

    <button onclick="closeWindow()">close btn</button>
    <script>
      function closeWindow() {
        console.log('close function');
      }
      function alert() {
        console.log('alert function');
      }
    </script>
    

    这样就可以避免与浏览器的内置函数发生冲突。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月10日
  • 已采纳回答 3月2日
  • 修改了问题 2月23日
  • 创建了问题 2月23日

悬赏问题

  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口