2021年8月23日 星期一

關於 JavaScript 的 eval() 的直接喚起與間接喚起

 關於 JavaScript 的 eval() 的直接喚起與間接喚起

前言

  最近發現 eval() 遽然有分直接喚起與間接喚起,雖然平常我不太用這個函式,但有時不得已還是要使用,所以就來做個學習,在此做個紀錄。


內容

  直接看範例,如下

var x = 'xxx';
function test(){
  var x = 'yyy';
  console.log( eval( 'x' ) );//'yyy'
  var f = eval;
  console.log( f( 'x' ) );//'xxx'
  console.log( ( 0 , eval )( 'x' ) );//'xxx'
  
}
test();


範例第一次和喚起 eval() 會顯示"yyy",這點跟認知的一樣,也被稱為"直接喚起",那間接喚起呢?

可以看到事先用一個變數賦值 eval 後,再透過該變數來喚起 eval() ,這樣的結果遽然不一樣!可以看到結果遽然顯示"xxx",也就是顯示的是 global 變數,而非 local 變數,間接喚起還有一個特殊的寫法,也就是"( 0 , eval )",這個語法可以在  [ developer.mozilla.org ] eval() 裡找到,和上述利用變數賦值 eval 的結果會一樣,這個語法可以不用再宣告變數,相當方便。請注意,範例的宣告都是用 var 來宣告,如果改成 let 的話就永遠只會顯示 local 變數,也就是如果程式碼已經習慣用 let 來宣告的話,那直接喚起與間接喚起沒差。


參考資料

[ developer.mozilla.org ] eval()

沒有留言:

張貼留言