当前位置: 首页 > 知识库问答 >
问题:

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

丌官玺
2023-07-07

这是一段防止用户打开开发者工具的代码。
执行结果是如果打开了开发者工具,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个答案

韦宏朗
2023-07-07

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

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

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

 类似资料:
  • 我不断得到: debug.log 我的包文件如下: 我是npm的新手,当我第一次下载它时,我能够在我的本地服务器上毫无问题地启动它。 我想切换我的浏览器,这样做,突然npm start有一个问题。 我知道还有其他类似的问题,但没有一个能缓解我的问题。

  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

  • 我有一个对我来说很奇怪的问题。我实现了,将使用执行。问题是,它只执行一次。。。 下面是有用的代码(是一个枚举): 有趣的是,如果我用一些if-else语句替换这个开关,它工作得很好,这意味着这个Runnable按照我的要求每50毫秒执行一次。。! 下面是调度设置: 为什么用if-else语句每50ms调用一次Runnable,为什么用switch只调用一次?? 编辑:因为你问,这里是MenuEve

  • 问题内容: 我一直在做倒计时计划,我想到了这个。 在while循环的最后,没有内部的print / println语句,倒计时代码将不会执行。怎么会?该程序可以很好地与print语句一起工作。 问题答案: 首先,您的程序是 线程不安全的, 因为它是一个 共享变量 ,但是在同步块中既不访问也不访问。 现在,偶然地是一种同步方法,并且在任何实际架构上,使用 内存屏障 CPU指令来实现进入和退出同步块,

  • 在每个print语句之前使用扫描器解决了这个问题,但我想要一个好的编程方法来解决这个问题。

  • 每个人我最近在学习如何反应。正如这个链接所说,我学到了一个教训:react函数加载两次。但当我验证它时,我发现它确实加载了两次,但Chrome浏览器只打印了一次。我想知道为什么?这是我验证过的代码。 我认为铬应该混合。日志 1 App.js: 9我已经跑了1次!2pp.js: 9我已经跑了两次了! 我想知道为什么。非常感谢。