JavaScript技巧(三)續

1.避免使用eval:
eval()函數可以將任意字符串當做一個JavaScript代碼來執行。當需要討論的代碼是預先就編寫好了(不是在動態運行時決定),時沒有理由需要使用eval()。而如果代碼是在運行時動態生成的,則也有其他更好的方法來代替eval()實現其功能。即:只需要用方括號將需要訪問的動態屬性括起來就行了

// 反模式:
var property = "name";
alert(eval("obj."+property));
// 推薦的方法 
var property = "name";
alert(obj[property]);

因爲訪問對象的屬性有兩種方式:obj.id 或者 obj[“id”] 。 而第二種方式方式的好處在於可以使用字符串拼接,這樣可以使用屬性的動態訪問,從而用來代替eval()

eval安全隱患:有可能執行被篡改過的代碼(例如來自網路的代碼),這是在處理來自一個Ajax請求的JSON響應時常見的反模式,最好是使用瀏覽器內置的方法(JSON.parse())來解析JSON請求,以確保安全性和有效性。要牢記避免使用setInterval()、setTimeout()和function()等構造函數來傳遞參數,在大部分
情形下,會導致類似eval()的隱患。

JavaScript仍然不得不評估和執行以程序代碼方式傳遞過來的字符串:

// 反模式
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);
// 推薦的模式
setTimeout(myFunc, 1000);
setTimeout(function() {
    myFunc(1, 2, 3);
}, 1000);

使用new Function()構造函數和eval()比較類似,因此該函數的使用也需要十分小心。如果一定需要使用eval(),那麼可以考慮使用new Function()來代替eval()。這樣做的潛在好處是由於在new Function()中的代碼將在局部函數空間中運行,因此代碼中任何採用var定義的變量不會自動成爲全局變量。另一個避免自動成爲全局變量的方法是將eval()調用封裝到一個即時函數中。

var str = "var un = 1; console.log(un);";
eval(str);//1

var str = "var deux = 2; console.log(deux);";
new Function(str)();//2

var str = "var trois = 3; console.log(trois);";
(function(){
    eval(str);//3
}());

typeof un;//number
typeof deux;//undefined
typeof trois//undefined
發佈了43 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章