请问这段代码是怎么执行的?为什么打开开发者工具就执行2次,不打开就只执行一次?

这是一段防止用户打开开发者工具的代码。
执行结果是如果打开了开发者工具,alert(num)执行了2次,如果没有打开只执行一次。请问为什么会出现执行2次?

function toDevtools() {
  let num = 0;
  let devtools = new Date();
  devtools.toString = function () {
    num++;
    console.log(222, num);
    alert(num)
    if (num > 1) {
      // window.location.href = "http://www.fly63.com"
      console.log(1111);
    }
  }
  console.log('', devtools);
}
toDevtools();

https://www.bilibili.com/video/BV1WV4y187Mv/?aid=870612797&ci...

阅读 1.9k
1 个回答

第一次执行是因为在控制台输出 console.log('', devtools) 时,控制台需要将 devtools 对象转换为字符串来显示。由于重写了 toString 方法,在转换对象为字符串时会执行重写的方法,并且 num 会加 1,然后触发 alert(num)

第二次执行是因为在重写的 toString 方法中,通过 alert(num) 再次触发了弹窗,并且此时 num 已经加 1,所以会弹出加 1 后的值。

如果没有打开开发者工具,只会执行一次 alert(num),因为重写的 toString 方法不会被调用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题