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
复制代码
相关文章
相关标签/搜索