我正在调试和升级一些遗留的 PHP 和 JavaScript 代码,我发现了一些我无法摆脱的 eval() 函数。来自桌面编程环境,使用 C/C++ 等编译语言,我从未在 javascript 中使用过 eval() 函数,主要是因为我不知道它的存在。我已经用谷歌搜索了一段时间,从我读过的所有内容中,我了解到 eval() 评估一个字符串,就好像它是合法的 javascript 代码并执行它一样。我已经设法摆脱了用于访问动态属性和解码 JSON 对象的 eval() 函数,但是有一个相当高级(且晦涩)的类定义使用 eval() 我无法击败.
示例代码:
function Ddl(N) {
this.lyr = document.getElementById(N);
this.obj = N+"DDL_Lyr";
eval(this.obj+"=this");
this.lyr.setAttribute("onchange", this.obj+".onChange();");
}
这个函数是一个对象构造函数。DDL 对象在网页中用作:
ddl_name = new Ddl('id_of_select');
ddl_name.onChange = event_function;
据我所知,eval(this.obj + "=this")
应该与onchange 事件函数相同,this.obj = this;
但event_function
不会触发 onchange 事件函数。我一直无法猜测为什么使用萤火虫。如果我使用this.obj = this
,我可以看到 this.obj 的值从更改id_of_selectDDL_Lyr
为指向 DDL 对象本身的指针,因此我可以弄清楚为什么 setAttribute 失败,但是使用 eval() 函数 this.obj
并不能反映代码执行时的更改,它始终保持为“id_of_selectDDL_Lyr”,但是它正在做某事,因为如果我将其注释掉,则不会触发 onchange 事件。
我怀疑它可能与本地或全局范围有关,因为我读过 eval() 调用是在不同的范围内执行的,但我不知道如何检查它,也不知道如何用正常替换 eval() javascript代码。