2

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

4

2 回答 2

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”的新全局变量(其中是变量)。N

于 2012-05-09T09:30:20.800 回答
-1

改变

this.lyr.setAttribute("onchange", this.obj+".onChange();");

this.lyr.onchange = this.obj+".onChange();";
于 2012-05-09T09:31:18.247 回答