再探JS---eval函式
eval函式
“魔鬼”函式?
如果你現在的程式碼中使用了eval(),記住該咒語“eval()是魔鬼”。此方法接受任意的字串,並當作JavaScript程式碼來處理。當有問題的程式碼是事先知道的(不是執行時確定的),沒有理由使用eval()。eval 用的好不好 其實和使用者的水平有關係
作用域
在eval()中建立的任何變數或函式都不會被提升,因為在解析程式碼的時候,它們被包含在一個字串中;它們只在eval()執行的時候建立
為什麼不提倡使用eval函式?
- 可讀性非常差
- 不好再做優化和編譯
- 會輕微增加效能消耗
- 不安全,比如 eval input 的值
直接引用 or 間接引用
var a = 1;
(function(){
var a = 2;
eval("console.log(a)");
//輸出為2
(0, eval)("console.log(a)");
//輸出是1
})()
間接引用eval,語句會被優化至全域性作用域
詳見stackoverflow
一些奇妙的用途
var arr = [1,2,3,4,5]
function sum(arr) {
return eval(arr.join('+'));
}
//輸出15
for (var loop = 1; loop < 10; loop++) {
eval('document.getElementById("div"+loop).innerHTML="123"');
}
但很多時候,我們仍能找到其他更高效的的方法替代eval
var obj={
name:'lxl',
age:20
}
//eval
var property = "name";
alert(eval("obj." + property));
// 更好的
var property = "name";
alert(obj[property]); //es6解構賦值
相關文章
- Go語言入門系列(六)之再探函式Go函式
- 函式模板深探函式
- 深入探討JavaScript函式物件JavaScript函式物件
- 函式詳解 | VLOOKUP 函式:最為人熟知的偵探函式
- 再談函式和一等公民函式
- 再探強化學習強化學習
- JavaScript學習筆記(七)—— 再說函式JavaScript筆記函式
- 溫故知新----再談建構函式 (轉)函式
- 再探JVM記憶體模型JVM記憶體模型
- 遊戲巨頭“再探”3A遊戲
- Julia位陣列的再探陣列
- 10、DNS隧道技術再探DNS
- 第二話 再探多型多型
- 資料結構 - 樹,再探資料結構
- 再探URLDNS鏈(手搓exp)DNS
- C++再議建構函式及複製建構函式深度複製C++函式
- 走近VB.Net(二) 再談函式呼叫 (轉)函式
- Vue原始碼探祕(五)(_render 函式的實現)Vue原始碼函式
- 簡單探討sum()函式返回null的問題函式Null
- Visual C++中函式呼叫方式淺探 (轉)C++函式
- Nuxt.js 錯誤偵探:useError 組合函式UXJSError函式
- 再探go modules:使用與細節Go
- LoadRunner(三)再識web_custom_request函式Web函式
- 再學Java 之 形參個數可變函式Java函式
- OpenResty學習筆記03:再探WAFREST筆記
- 資料結構 - 雜湊表,再探資料結構
- 別再說SUM函式很簡單,進來看看吧!函式
- C語言關於回撥函式和this指標探討C語言函式指標
- 再探C++的單件實現 (轉)C++
- ClickHouse原始碼筆記5:聚合函式的原始碼再梳理原始碼筆記函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- 再探.NET的PE檔案結構(安全篇)
- 再探堆疊欺騙之動態欺騙
- 【函式式 Swift】函式式思想函式Swift
- javascript 事件觸發以後函式指定時間後再執行JavaScript事件函式
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle