[英]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.