少用 eval(),使用 eval() 有安全疑慮,因為被執行的代碼(例如從網絡來)可能已被篡改。
同樣重要的是要記住,給 setInterval()、setTimeout() 和 Function() 構造函數傳遞字符串,大部分情況下,與使用 eval() 是類似的,因此要避免。在幕後,JavaScript 仍需要評估和執行你給程序傳遞的字符串:
// 反面示例
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);
// 更好的
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);
若在 eval() 中宣告變數 , 會視為全域變數 , 建議改用 new Function()
eval( "var un = 1; console.log(un);"); // logs "1" <<< 不建議
new Function("var deux = 2; console.log(deux);")(); // logs "2"
(function () {
eval( "var trois = 3; console.log(trois);");
}()); // logs "3"
console.log(typeof un); // number
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"
使用 eval() 可以直接使用外部的變數,而使用 Function() 不行
(function () {
var local = 1;
eval("local = 3; console.log(local)"); // logs "3"
console.log(local); // logs "3"
Function("console.log(typeof local);")(); // logs undefined
}());