首頁 > web前端 > js教程 > JavaScript進階系列—為什麼不要使用 eval

JavaScript進階系列—為什麼不要使用 eval

黄舟
發布: 2017-02-08 09:40:36
原創
1380 人瀏覽過
  • 偽裝的 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 函式。

🎜結論🎜🎜絕對不要使用 eval,任何使用它的程式碼都會在它的工作方式,性能和安全性方面受到質疑。 如果一些情況必須使用到 eval 才能正常工作,首先它的設計會受到質疑,這不應該是首選的解決方案, 一個更好的不使用 eval 的解決方案應該得到充分考慮並優先採用。 🎜🎜以上就是JavaScript進階系列—為什麼不使用 eval的內容,更多相關內容請關注PHP中文網(m.sbmmt.com)! 🎜🎜🎜🎜
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板