我有这个内联的js代码.

let btn = document.querySelector("button");
btn.addEventListener("click", foo, { once: true });

function foo() {
  btn.addEventListener("click", bar, { once: true });
  console.log("Foo called");
  console.trace();
}

function bar() {
  btn.addEventListener("click", buz, { once: true });
  console.log("Bar called");
  console.trace();
}

function buz() {
  btn.addEventListener("click", foo, { once: true });
  console.log("Buz called");
  console.trace();
}
<button>Click</button>

我收到的结果有点难以理解.点击几下按钮后,它会显示如下所示.

Foo called index.html:11:17
foo file:///.../index.html:12
    (Async: EventListener.handleEvent)

Bar called index.html:16:17
bar file:///.../index.html:17
    (Async: EventListener.handleEvent)
foo file:///.../index.html:10
    (Async: EventListener.handleEvent)

Buz called index.html:21:17
buz file:///.../index.html:22
    (Async: EventListener.handleEvent)
bar file:///.../index.html:15
    (Async: EventListener.handleEvent)
foo file:///.../index.html:10
    (Async: EventListener.handleEvent)

正如您所看到的,在"名为index.html:16:17的Bar"行,似乎有两个堆栈帧.在"Buz Call"处有三个堆栈帧.所以我的问题是为什么会发生这种情况?

我预计它会产生这样的东西.

Foo called index.html:11:17
foo file:///.../index.html:12
    (Async: EventListener.handleEvent)

Bar called index.html:16:17
bar file:///.../index.html:17
    (Async: EventListener.handleEvent)

Buz called index.html:21:17
buz file:///.../index.html:22
    (Async: EventListener.handleEvent)

推荐答案

在文档页面的顶部有这样一条注释:

Note:在一些浏览器中,console.trace()还可以输出导致不在调用堆栈上的当前console.trace()的调用和异步事件的序列,以帮助识别当前事件求值循环的来源.

console.trace() | MDN

这既不是Chrome的错误,也不是Firefox的错误,因为规范明确指出跟踪是特定于实现的:

1.1.8.1.1.8.跟踪(...日期)

  1. 假设trace是调用该函数的调用栈的特定于实现的、可能是交互的表示形式.
  2. 可选地,假设formattedDataFormatter(data)的结果,并且并入formattedData作为trace的标签.
  3. 执行Printer("跟踪","trace").

Console Standard | WHATWG

Javascript相关问答推荐

为什么使用MAX_SAFE_INTEGER生成随机整数时数字分布不准确?

布局样式在刷新时不持续

在JS中获取名字和姓氏的首字母

提交表格后保留Web表格中的收件箱值?

被CSS优先级所迷惑

Angular中计算信号和getter的区别

从Node JS将对象数组中的数据插入Postgres表

并不是所有的iframe都被更换

Javascript json定制

制作钢琴模拟器,并且在控制台中不会执行或显示该脚本

类构造函数不能在没有用With Router包装的情况下调用

TypeError:无法分解';React2.useContext(...)';的属性';basename';,因为它为空

第二次更新文本输入字段后,Reaction崩溃

使用Nuxt Apollo在Piniastore 中获取产品细节

邮箱密码重置链接不适用于已部署的React应用程序

钛中的onClick事件需要在两次点击之间等待几秒钟

为列表中的项目设置动画

我们是否可以在reactjs中创建多个同名的路由

如何在Web项目中同步语音合成和文本 colored颜色 更改

将以前缓存的 Select 器与querySelector()一起使用