我想在javascript应用程序中计算对eval的调用次数。
我想出了以下内容,但它会产生错误。这些错误很难跟踪,而且我对应用程序的了解有限。
你能说出我的代码有什么问题吗?
increment = function (){
var me = arguments.callee;
if (!me.count) me.count = 0;
return ++me.count;
}
var oldEval = eval;
eval = function eval(string){
console.log('eval number ', increment());
return oldEval(string);
}
或者你知道另一种计算eval使用的方法吗?
感谢
奥利弗
答案 0 :(得分:5)
不幸的是,没有一种模拟/包装eval的防水方法,因为它不是正常的功能。它可以访问(读取和写入)直接调用者的局部变量。
function testeval() {
var a= 2;
eval('a*= 2');
alert(a); // 4
};
这是您无法通过本机JavaScript函数模拟的魔力。你无法从myWrappedEval获取调用者中的a
值或写回更改的值。虽然您可以使用arguments.caller
来获取调用函数,但是无法读取函数调用的局部函数。
在您在源中找到increment
的每次使用之前,您必须手动插入eval
的来电。或者,更好的是,删除对eval
的每次调用,并用更好的代码替换它,使调用总数为零。 ; - )
答案 1 :(得分:1)
我想出了一个基本的解决方案。它似乎工作,至少我可以收集一些数据,但我不是100%肯定它是正确的。
所以我只是这样做:
eval = eval;
有了这个,firebug的探查器能够计算对eval的调用,但不会对该计数进行分组,因此我必须复制并粘贴到excel,并构建一个数据透视表以获取数据。
答案 2 :(得分:0)
唯一跳出来的是你的参数名称“string”
尝试将其更改为“str”或其他内容。有些浏览器可能不喜欢“String”,因为它实际上是一个类名(特别是IE,有时会忽略区分大小写)
注意我测试了你的代码,它适用于Firefox 3.5(安装了Firebug插件)
如果您没有在所述控制台对象上定义console
对象或log
方法 - 您将收到错误。 (例如,如果未安装Firebug或类似物)
答案 3 :(得分:-1)
试试这个修改过的版本
var increment = function () {
var me = arguments.callee;
if (!me.count) me.count = 0;
return ++me.count;
}
var oldEval = eval;
eval = function (str) {
alert('eval number ' + increment());
return oldEval(str);
}
string
重命名为str
console.log
(并非在所有浏览器中都可用)