偽裝的 eval
安全問題
結論
eval 函數會在當前作用域字串中執行一段 JavaScript 程式碼
eval 函數會在目前作用域字串中執行一段 JavaScript 程式碼eval 函數會在目前作用域字串中執行一段 JavaScript 程式碼
eval 函數會在目前作用域字串中執行一段 JavaScript 程式碼。var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1但是 eval 只在被直接呼叫並且呼叫函數就是 eval 本身時,才在目前作用域中執行。
var foo = 1; function test() { var foo = 2; var bar = eval; bar('foo = 3'); return foo; } test(); // 2 foo; // 3譯者註:上面的代碼等價於在全局作用域中調用 eval,和下面兩種寫法效果一樣:
// 写法一:直接调用全局作用域下的 foo 变量 var foo = 1; function test() { var foo = 2; window.foo = 3; return foo; } test(); // 2 foo; // 3 // 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域 var foo = 1; function test() { var foo = 2; eval.call(window, 'foo = 3'); return foo; } test(); // 2 foo; // 3在任何情況下我們都應該避免使用 eval 函數。 99.9% 使用 eval 的場景都有不使用 eval 的解。 偽裝的 eval定時函數 setTimeout 和 setInterval 都可以接受字串作為它們的第一個參數。 這個字串總是在全域作用域中執行,因此 eval 在這種情況下沒有被直接呼叫。 安全問題
eval 也存在安全問題,因為它會執行任意傳給它的程式碼, 在程式碼字串未知或是來自一個不信任的來源時,絕對不要使用 eval 函式。