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
複製代碼