再探JS---eval函式

weixin_45683463發表於2020-12-29

eval函式

“魔鬼”函式?

如果你現在的程式碼中使用了eval(),記住該咒語“eval()是魔鬼”。此方法接受任意的字串,並當作JavaScript程式碼來處理。當有問題的程式碼是事先知道的(不是執行時確定的),沒有理由使用eval()。eval 用的好不好 其實和使用者的水平有關係

作用域

在eval()中建立的任何變數或函式都不會被提升,因為在解析程式碼的時候,它們被包含在一個字串中;它們只在eval()執行的時候建立

為什麼不提倡使用eval函式?

  1. 可讀性非常差
  2. 不好再做優化和編譯
  3. 會輕微增加效能消耗
  4. 不安全,比如 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解構賦值

相關文章