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函数内的局部变量。

var fn = new function(arg1,arg2, ...,argN,function_body) ;

上面的形式中,每个 arg 都是一个参数,最后一个参数是函数主体(要执行的代码)。这些参数必须是字符串。
如下 函数 sayHi 有两种等同的定义方式:

function sayHi(sName, sMessage) {
  alert("Hello " + sName + sMessage);
}

等同于 :

 var sayHi  =  new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);")

注意 :
尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。
Function 对象的 length 属性,返回它实例函数的参数的形参个数 ;
Function 对象的方法 : Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用 .

你可能感兴趣的:(eval和new Function)