eval和new Function的區別


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()    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM