eval和new Function的區別

eval和new Function均可以動態解析和執行字符串。可是它們對解析內容的運行環境斷定不一樣。bash

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函數內的局部變量。ui

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

var a = 'global scope'
        function b(){
            //var a = 'local scope' 
            eval('console.log(a)') //global scope
            ;(new Function('','console.log(a)'))() //global scope
        }
        b()
複製代碼
function sayHi(sName, sMessage) {
  alert("Hello " + sName + sMessage);
}
函數生命能夠寫成這樣的形式
因此也就很容易理解 new Function()能夠執行js代碼了,而且,只能執行全局的
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
複製代碼

注意:儘管能夠使用 Function 構造函數建立函數,但最好不要使用它,由於用它定義函數比用傳統方式要慢得多。不過,全部函數都應看做 Function 類的實例。prototype

var arr = [];
    var obj = {}
    console.log(Object.prototype.toString.call(arr));  //[object Array]
    console.log(Object.prototype.toString.call(obj));   //[object Object]s
複製代碼
相關文章
相關標籤/搜索