计算对eval的调用

时间:2009-11-25 14:49:46

标签: javascript eval override

我想在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使用的方法吗?

感谢

奥利弗

4 个答案:

答案 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
  • 使用alert而不是console.log(并非在所有浏览器中都可用)
  • 将呼叫更改为警报以使用字符串连接
  • 将新的eval函数更改为匿名(已删除的eval名称)