这是一段防止用户打开开发者工具
的代码。
执行结果是如果打开了开发者工具,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...
第一次执行是因为在控制台输出
console.log('', devtools)
时,控制台需要将 devtools 对象转换为字符串来显示。由于重写了toString
方法,在转换对象为字符串时会执行重写的方法,并且num
会加1
,然后触发alert(num)
。第二次执行是因为在重写的
toString
方法中,通过alert(num)
再次触发了弹窗,并且此时num
已经加1
,所以会弹出加1
后的值。如果没有打开开发者工具,只会执行一次
alert(num)
,因为重写的toString
方法不会被调用。