eval()和全局范围

时间:2012-05-09 09:18:11

标签: javascript eval

我正在调试和升级一些遗留的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代码。

2 个答案:

答案 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();";