深入探討差異:JavaScript 中 eval() 和 new Function() 可以互換嗎?
在 JavaScript 中,我們常遇到這樣的函數eval() 和 new Function()。雖然它們的語法乍看之下似乎很相似,但仔細檢查就會發現它們的行為有根本差異。
考慮以下單語句函數:
var evaluate = function(string) { return eval('(' string ')'); } var func = function(string) { return (new Function( 'return (' string ')' )()); } console.log(evaluate('2 1')); console.log(func('2 1'));
這兩個函數的運算是否相同?與流行的看法相反,它們不是。
eval() vs. new Function()
為了說明這個差異,請考慮下列函數:
function test1() { var a = 11; eval('(a = 22)'); alert(a); // alerts 22 }
在此範例中,eval() 修改了 test1() 函數中的局部變數 'a',導致警報為 22。但是,如果我們使用 new Function('return (a = 22);')(),局部變數'a'將保持不變。
含義和注意事項
雖然eval() 和new Function() 都達到了各自的目的,但值得注意的是eval() 具有固有的安全風險。它存取局部變數並可能修改全域範圍的能力可能會導致意想不到的後果。
因此,除非絕對必要,否則通常建議避免使用 eval()。傳遞到 eval() 的不受信任的資料可能會損害應用程式的安全性。同樣,在處理不受信任的輸入時應謹慎使用 new Function()。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3