过瑞数中的高级debugger
(function() { var a = new Date(); debugger ;return new Date() - a > 100; }())
这种debugger 如果是用‘一律不在此处暂停’是过不去的。
要在浏览器的控制台中执行并阻止 debugger
语句,你可以使用 JavaScript 的 toString()
方法来重写原函数的定义。
这种方法更复杂,因为它需要操纵函数的字符串表示形式,但它可以在不直接修改原始代码的情况下绕过 debugger
。
这里是一个示例代码,它展示了如何通过重写 Function.prototype.toString
方法来实现这一目的:
(function() { // 保存原始的 toString 方法 var originalToString = Function.prototype.toString; // 重写 toString 方法 Function.prototype.toString = function() { var originalCode = originalToString.call(this); // 检查并移除 debugger 语句 var modifiedCode = originalCode.replace(/debugger;/g, ''); return modifiedCode; }; // 假设这是要绕过的原始函数 var originalFunction = function() { var a = new Date(); debugger; return new Date() - a > 100; }; // 测试重写后的函数 console.log(originalFunction.toString()); console.log(originalFunction()); })();
详细中文注释:
-
var originalToString = Function.prototype.toString;
:保存原始的toString
方法,以便于在重写的方法中调用。 -
Function.prototype.toString = function() {...}
:重写Function
对象的toString
方法。任何函数调用toString
方法时,都会调用这个新的方法。 -
var originalCode = originalToString.call(this);
:通过原始的toString
方法获取当前函数的源代码。 -
var modifiedCode = originalCode.replace(/debugger;/g, '');
:使用正则表达式移除源代码中的所有debugger;
语句。 -
var originalFunction = function() {...}
:这是你想要绕过的原始函数。 -
console.log(originalFunction.toString());
和console.log(originalFunction());
:分别测试重写后的toString
方法和修改后的函数执行。
当你在浏览器控制台中运行这段代码时,它将重写 Function.prototype.toString
方法,并自动移除任何函数的 debugger;
语句。这样,即使原始函数包含 debugger
语句,它也不会触发调试器暂停。