簡體   English   中英

eval()和全局范圍

[英]eval() and global scope

我正在調試和升級一些舊的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;相同this.obj = this; 但隨后不會觸發onchange事件函數event_function 我一直無法猜測為什么要使用螢火蟲。 since if I comment it out the onchange event is not fired. 如果我使用this.obj = this我可以看到this.obj改變的值id_of_selectDDL_Lyr的指針DDL對象本身,所以我可以弄清楚為什么的setAttribute失敗,但使用eval()函數this.obj不看為了在執行代碼時反映出更改,它始終保持為'id_of_selectDDL_Lyr',但是它正在執行因為如果我將其注釋掉,則不會觸發onchange事件。

我懷疑它可能與本地或全局范圍有關,因為我已經閱讀過eval()調用是在不同的范圍內執行的,但是我不知道如何修改它,也不知道如何用普通的eval()代替JavaScript代碼。

認為這段代碼是等效的:

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是變量)。

更改

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

this.lyr.onchange = this.obj+".onChange();";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM