1. 程式人生 > >eval和new Function的區別

eval和new Function的區別

light console ole 運行環境 相同 fun glob rip UNC

eval和new Function都可以動態解析和執行字符串。但是它們對解析內容的運行環境判定不同。

 var a = ‘global scope‘
      function b(){
           var a = ‘local scope‘
           eval(‘console.log(a)‘) //local scope
           ;(new Function(‘‘,‘console.log(a)‘))() //global scope
      }
      b()

  

eval中的代碼執行時的作用域為當前作用域。它可以訪問到函數中的局部變量。

new Function中的代碼執行時的作用域為全局作用域,不論它的在哪個地方調用的。所以它訪問的是全局變量a。它根本無法訪問b函數內的局部變量。

註意,當我們在b函數中不定義變量a時,兩種方法的輸出相同。這與上述結論並不沖突。因為代碼執行時,對變量的查找是從內到外的。當eval中的代碼執行時,它依然是優先從b函數內部查找a變量,當查找不到時,再到全局中查找a,這時找到的a當然是‘global scope‘。

        var a = ‘global scope‘
        function b(){
            //var a = ‘local scope‘ 
            eval(‘console.log(a)‘) //global scope
            ;(new Function(‘‘,‘console.log(a)‘))() //global scope
        }
        b()    

  

eval和new Function的區別