我正在调试和升级一些遗留的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")
应与this.obj = this;
相同,但不会触发onchange事件函数event_function
。我无法猜到为什么使用萤火虫。如果我使用this.obj = this
,我可以看到this.obj的值从id_of_selectDDL_Lyr
更改为指向DDL对象本身的指针,因此我可以解释为什么setAttribute失败,但使用eval()函数{{1在执行代码时,它不会反映更改,它始终保持为'id_of_selectDDL_Lyr',但它正在执行某些,因为如果我将其注释掉,则不会触发onchange事件。
我怀疑它可能与本地或全局范围有关,因为我已经读过eval()调用是在不同的范围内执行的,但我不知道如何ckeck它也不知道如何替换eval( )使用正常的javascript代码。
答案 0 :(得分:1)
我认为这段代码是等价的:
function Ddl(N) {
var self = this;
this.lyr = document.getElementById(N);
this.obj = N + "DDL_Lyr";
window[this.obj] = this;
this.lyr.onchange = function() {
self.onChange();
};
}
eval
并未说this.obj = this
,它正在使用名称“N + DDL_Lyr”(其中{{}创建一个新的全局变量1}}是可变的。)
答案 1 :(得分:-1)
变化
this.lyr.setAttribute("onchange", this.obj+".onChange();");
到
this.lyr.onchange = this.obj+".onChange();";